c/c++位運算詳解及相關作用。
運算子含義描述
& 按位與
如果兩個相應的二進位制位都為1,則該位的結果值為1,否則為0
i 按位或
兩個相應的二進位制位中只要有乙個為1,該位的結果值為1
^ 按位異或
如果參加運算的兩個二進位制位值相同則為0,否則為1
~ 取反
~是一元運算子,用來對乙個二進位制數按位取反,即將0變1,將1變0
<< 左移
用來將乙個數的各二進位制位全部左移n位,右補0
>> 右移
將乙個數的各二進位制位右移n位,移到右端的低位被捨棄,對於無符號數,高位補0
(1)清零
若想對乙個儲存單元清零,即使其全部二進位制位為0,只要找乙個二進位制數,其中各個位符合一下條件:原來的數中為1的位,新數中相應位為0。然後使二者進行&運算,即可達到清零目的。
例:原數為43,即00101011,另找乙個數,設它為148,即10010100
將兩者按位與運算:
00101011 & 10010100,得00000000
(2)取乙個數中某些指定位
若有乙個整數a(2byte),想要取其中的低位元組,只需要將a與8個1按位與即可。
a 00101100 10101100 & b 00000000 11111111,得c 00000000 10101100
(3)保留指定位:
與乙個數進行「按位與」運算,此數在該位取1。
例如:有一數84,即01010100,想把其中從左邊算起的第3,4,5,7,8位保留下來.
運算如下:
01010100 & 00111011,得 00010000
即:a=84,b=59
c=a&b=16
(4)判斷奇偶
只要根據最末位是0還是1即可判斷整數的奇偶性。例如整數n,可以用if((n & 1) == 0)來判斷,要比if(n % 2 == 0)判斷奇偶性效率高。
(5)判斷乙個整數是不是2的整數次方
如果乙個整數是2的整數次方,那麼它的二進位制標識中一定有且只有一位是1,而其他所有位均為0.
解決方案:
把這個整數減去1之後再和本身做與運算,這個整數中唯一的乙個1就會變成0.所以只要判斷是不是等於0即可。
(1)按位或運算常用來對乙個資料的某些位定值為1
如果想使乙個數a的低4位改為1,則只需要將a與15進行按位或運算即可。
(1)使特定位翻轉
設有數01111010,想使其低4位翻轉,即1變0,0變1。可以將其與00001111進行「異或」運算。
即:01111010 ^ 00001111,得01110101
運算結果的低4位正好是原數低4位的翻轉。可見,要使哪幾位翻轉就將與其進行∧運算的該幾位置為1。
(2)與0相「異或」,保留原值
例如:012 ^ 00=012
00001010 ^ 00000000,得00001010
因為原數中的1與0進行異或運算得1,0^0得0,故保留原數。
(3) 交換兩個值,不用臨時變數
例如:a=3,即11;b=4,即100。
想將a和b的值互換,可以用以下賦值語句實現:
a=a∧b;
b=b∧a;
a=a∧b;
a=011
(∧)b=100
a=111(a∧b的結果,a已變成7)
(∧)b=100
b=011(b∧a的結果,b已變成3)
(∧)a=111
a=100(a∧b的結果,a已變成4)
等效於以下兩步:
① 執行前兩個賦值語句:「a=a∧b;」和「b=b∧a;」相當於b=b∧(a∧b)。
② 再執行第三個賦值語句: a=a∧b。由於a的值等於(a∧b),b的值等於(b∧a∧b),因此,相當於a=a∧b∧b∧a∧b,即a的值等於a∧a∧b∧b∧b,等於b。
(4) 快速判斷兩個值是否相等
例如:判斷兩個整數a = 1,b = 1是否相等,則可通過異或實現。
一元運算子,用於求整數的二進位制反碼(變換符號),即分別將運算元各二進位制位上的1變為0,0變為1。
例如:~77變77。
左移運算子是用來將乙個數的各二進位制位左移若干位,移動的位數由右運算元指定(右運算元必須是非負值),其右邊空出的位用0填補,高位左移溢位則捨棄該高位。
左移1位相當於該數乘以2,左移2位相當於該數乘以2*2=4,15<<2=60,即乘了4。但此結論只適用於該數左移時被溢位捨棄的高位中不包含1的情況。
右移運算子是用來將乙個數的各二進位制位右移若干位,移動的位數由右運算元指定(右運算元必須是非負值),移到右端的低位被捨棄,對於無符號數,高位補0。
*注意:*對無符號數,右移時左邊高位移入0;對於有符號的值,如果原來符號位為0(該數為正),則左邊也是移入0。如果符號位原來為1(即負數),則左邊移入0還是1,要取決於所用的計算機系統。有的系統移入0,有的系統移入1。移入0的稱為「邏輯移位」,即簡單移位;移入1的稱為「算術移位」。
結合:《左移運算子與《左移運算子相關應用
(1)高低位互換
給出乙個16位的無符號整數。稱這個二進位制數的前8位為「高位」,後8位為「低位」。現在寫一程式將它的高低位交換。例如,數34520用二進位制表示為:
10000110 11011000
將它的高低位進行交換,我們得到了乙個新的二進位制數:
11011000 10000110
它即是十進位制的55430。
這個問題用位操作解決起來非常方便,設x=34520=10000110 11011000(二進位制) 由於x為無符號數,右移時會執行邏輯右移即高位補0,因此x右移8位將得到00000000 10000110。而x左移8位將得到11011000 00000000。可以發現只要將x>>8與x<<8這兩個數相或就可以得到1101100010000110。
位運算 用途
在 中我們常會看到位運算 位運算是一種高效的運算機制,利用二進位制來進行 資料型別 byte 8 boolean 8 short 16 int 32 long 64 float 32 double 64 char 16 4 用 二進位制表示 0000 0000 0000 0000 0000 0000...
C C 位操作 位運算
在c語言中,可以單獨操控變數的位 bit 一般高階語言不會處理這級別的細節,c在提供高階語言便利的同時,還能為組合語言所保留的級別上工作,這使其成為編寫裝置驅動程式和嵌入式 的首選語言。目錄 二進位制整數 binary 有符號整數 八進位制 octal 十六進製制 hex 位運算子 按位與 的用途 ...
C C 常見位運算
左移運算子 右移運算子 無符號右移運算子 按位與 按位或 按位非 按位異或,相同位為0,不相同為1 判斷x是奇數還是偶數 x 1 0 x乘以乙個2的n次方的數 x n 消去x最後一位的1 x x 1 求x的相反數 x 1 或者 x 1 x的異或操作 x x 1 把x從右邊數第n位變1 x 1 n 1...