正文 第46章 位運算1(1 / 2)

在程序設計中,可以操作的最小數據單位是二進製位(bit)。理論上,我們可以按“位”來運算以完成所有的運算和操作。位運算是指按照二進製位進行的運算,是對字節或字中的實際存儲的二進製位進行檢測、設置或移位。通常,按位操作是用來產生控製信號以控製硬件操作或者實現數據變換。有些時候,靈活的位操作可以有效提高程序運行效率。由於C語言具有按位運算的功能,所以C語言也能像彙編語言一樣編寫係統程序。

C語言提供了六種位運算符,這些運算符的操作數隻能是整型數據,即隻能操作帶符號或無符號的char、short、int與long類型數據。

現將每個位運算符詳細介紹如下:

1.按位與運算符(&)

按位與運算符“&”是雙目運算符,其功能是對參與運算的兩數相對應位進行邏輯與操作。其結果是:隻有對應的兩個二進製位均為1才為1,否則為0。這裏的1可以理解為邏輯值真,0可以理解為邏輯值假。按位與的本質和邏輯與的運算規則一致。其中,參與運算的操作數均以補碼形式出現。

[例121]計算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

[例122]計算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即可。

[例123]清零特定位。

#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即可。