官术网_书友最值得收藏!

2.7 位運算

所謂位運算是指進行二進制位的運算。C語言提供如下幾種位運算符:

& 按位與

| 按位或

^ 按位異或

~ 取反

<< 左移

>> 右移

說明:

①位運算符中除“~”以外,均為二目運算符,即要求兩側各有一個運算量。

②運算量只能是整型或字符型的數據。

(1)按位與運算符(&)

參加運算的兩個運算量,如果兩個相應的位都為1,則該位的結果值為1,否則為0,即:

0&0=0;0&1=0;1&0=0;1&1=1

例如:3&5,先把3和5以補碼表示,再進行按位與運算。

  

它是1的補碼,因此3&5=1。

按位與有一些特殊的用途:

①清零。如果想將一個單元或某一位清零,將其與0進行與運算即可。

②取一個數中某些指定位。如只想要P1口的低4位,只需將P1和0x0f相與即可。

③要想將哪一位保留下來,就與一個數進行與運算,此數在該位取1,其余位取0,例如:有一數01010101,想把其中左面第3、4、5、7、8位保留下來,可以這樣:

  

(2)按位或運算符(|)

兩個相應位中只要有一個為1,該位的結果值為1。即:

0|0=0;0|1=1;1|0=1;1|1=1

例如:八進制數060|017

  

按位或運算常用來對一個數據的某些位定值為1。

(3)按位異或運算符(^)

也稱XOR運算符。它的規則是:參加運算的兩個相應位同號,則結果為0;異號則為1。即:

0^0=0; 0^1=1; 1^0=1; 1^1=0

  

異或運算的應用:

①使特定位翻轉。假設有01111010,想使其低4位翻轉,即1變為0,0變為1。可以將它與00001111進行異或運算。即:

  

結果值的低4位正好是原數低4位的翻轉。因為任意位與0異或保留原值,與1異或取反,故要使哪幾位翻轉就將與其進行異或運算的數中該幾位為1即可。

②交換兩個值,不用臨時變量。

例:a=3,b=4,想將a和b的值互換,可以用以下賦值語句實現。

a=a^b;

b=b^a;

a=a^b;

可以用豎式來說明:

  

(4)取反運算符(~)

“~”是一個單目運算符,用來對一個二進制數按位取反,即將0變1,1變0。

例:~025是對八進制數25(0000000000010101)按位取反。

  

(5)左移運算符(<<)

假設對一個字節進行左移運算,如圖2-12所示:

圖2-12 左移運算

高位左移后溢出,舍棄不起作用,右端低位補0。

“<<”用來將一個數的各二進位全部左移若干位。

例:a=a<<2

將a的二進制數左移2位,右補0。若a=15,即二進制數00001111,左移2位得00111100,即十進制數60。

左移1位相當于該數乘以2,左移2位相當于該數乘以4。但此結論只適用于該數左移時被溢出,舍棄的高位中不包含1的情況。

(6)右移運算符(>>)

假設對一個字節進行右移運算,如圖2-13所示:

圖2-13 右移運算

低位右移后溢出,舍棄不起作用,左端位高補0。

如:a>>2表示將a的各位二進位右移2位。移到右端的低位被舍棄,對無符號數,高位補0。

如:a=017,

  

右移1位相當于除以2。

在右移時,需要注意符號位問題,對無符號數,右移時左邊高位移入0。對有符號的值,如果原來符號位為0,則左邊也是移入0,如果符號位原來為1,則左邊移入0還是1,要取決于所用的計算機系統。

(7)位運算符與賦值運算符結合

位運算符與賦值運算符結合可以組成擴展的賦值運算符。

如:&=,|=,  <<=,  >>=,  ^=

例:a&=b相當于a=a&b

a<<=2相當于a=a<<2

【例2-18】取一個整數a從右端開始的4~7位。

  

(8)循環移位

循環移位有循環左移和循環右移,如圖2-14所示。

圖2-14 循環移位

在C程序中,如需循環移位,可加頭文件<intrins.h>,然后調用庫函數_crol_(循環左移)和_cror_(循環右移)。

【例2-19】將P1口循環左移2位。

  

主站蜘蛛池模板: 西峡县| 邵武市| 东港市| 湖南省| 隆子县| 泸水县| 平武县| 湾仔区| 怀柔区| 民勤县| 邵武市| 中阳县| 苏尼特右旗| 常宁市| 崇阳县| 慈利县| 新沂市| 龙泉市| 周宁县| 阜新市| 汝阳县| 准格尔旗| 香河县| 库车县| 常州市| 阜康市| 七台河市| 平山县| 清涧县| 闽清县| 密云县| 宁阳县| 咸阳市| 清原| 奇台县| 汾阳市| 湘潭县| 扶绥县| 墨江| 陵川县| 德清县|