在程序設計中,可以操作的最小數據單位是二進製位(bit)。理論上,我們可以按“位”來運算以完成所有的運算和操作。位運算是指按照二進製位進行的運算,是對字節或字中的實際存儲的二進製位進行檢測、設置或移位。通常,按位操作是用來產生控製信號以控製硬件操作或者實現數據變換。有些時候,靈活的位操作可以有效提高程序運行效率。由於C語言具有按位運算的功能,所以C語言也能像彙編語言一樣編寫係統程序。
C語言提供了六種位運算符,這些運算符的操作數隻能是整型數據,即隻能操作帶符號或無符號的char、short、int與long類型數據。
現將每個位運算符詳細介紹如下:
1.按位與運算符(&)
按位與運算符“&”是雙目運算符,其功能是對參與運算的兩數相對應位進行邏輯與操作。其結果是:隻有對應的兩個二進製位均為1才為1,否則為0。這裏的1可以理解為邏輯值真,0可以理解為邏輯值假。按位與的本質和邏輯與的運算規則一致。其中,參與運算的操作數均以補碼形式出現。
[例121]計算9&7。
9的二進製補碼為00001001,7的二進製補碼為00000111,則9&7的算式為00001001&00000111,進行按位與操作後結果為00000001,00000001為1的二進製補碼。
可見9&7=1。
C語言源代碼:
#include
voidmain()
{
inta=9,b=7;
printf("a=%d\nb=%d\na&b=%d\n",a,b,a&b);
}
運行結果:
a=9
b=7
a&b=1
[例122]計算64766&255。
255的二進製數為0000000011111111。
C語言源代碼:
#include
voidmain()
{
inta=64766,b=255;
printf("a=%d\nb=%d\na&b=%d\n",a,b,a&b);
}
運行結果:
a=64766
b=255
a&b=254
該程序將64766的高8位清0,保留低8位。由此可見按位與運算可以用來對某些位清0或保留某些位。下麵我們討論按位與操作的用途:
(1)清零特定位
如果想對某個存儲單元的某個二進製位清零,即希望置其相應二進製位為0,我們隻要找到一個新二進製數,滿足如下條件:原數中為1的位,新數中相應位為0,然後使兩者進行“&”運算,即可達到清零目的,即mask中特定位為0,其他位為1,計算s=s&mask即可。
[例123]清零特定位。
#include
voidmain()
{
inta=43;
printf("a&100=%d",a&100);
}
運行結果:
a&100=32
即將a的第6位置1,其餘位清0。
(2)取某數中指定位
若有一個整數,想要取其某部分字節,隻需要將這個整數與相應位為1的數按位與即可,即mask中特定位置1,其他位為0,計算s=s&mask即可。