首先列舉出以下幾個常用的位操作符
&(與) ,|(或),~(非),^(異或),<<(左移),>>(右移)
作用:
1、&(與)
a&b
當a和b都為1時,結果為1否則為0
int a = 0x11;
a &= 0xf0; // 此時a=0x10
對以上步驟詳解如下:
先將十六進製制數a與0xf0轉換為二進位制,然後按位相與
0x11 *****==>0001 0001
0xf0 *****==>1111 0000
**********==>0001 0000(0x10)
由上可以看出,可以將乙個數與0相與(&)來將這數的某位清零
2、|(或)
a | b
a與b只要不全為0結果就為1,否則結果為0
int b = 0x02;
b |= 0xf0; // b的結果為0xf2
|在上段**的作用是:將b高4位置1
3、~(非)
~a 按位取反,若a為0,則結果為1,若為1則結果為0
4、^(異或)
a^b
a與b不同時,結果為1;相同則結果為0
因此和0異或,就是本身;和1異或就取反
利用這一特性可以實現不新增第三個變數,交換兩個整數的值
int a = 10
;int b = 20
;a = a ^ b;
b = a ^ b; // b = a ^ b ^ b (b^b=0) a^0 = a
a = a ^ b;
printf("a=%d, b=%d", a, b); // a=20,b=10
5、左移(<<)
a = 1111 1111
a<<2: 1111 1100 (a左移了2位)
所以《就是左邊丟棄,右邊補位(補0)
乙個數左移了n位後,相當於乘以2的n次方
6、右移(>>)
右移的原理與左移類似,右邊丟棄,左邊補位
不過右移分為算數右移和邏輯右移
邏輯右移:左邊補0
算數右移,當被運算元有符號時,規則不同
正數:左邊補0
負數:左邊補1
所以右移最好是無符號數
與左移類似,右移n為,相當於除以2的n次方
使用位操作
見朋友出了問題,最近訪問技術論壇時,大致是這樣的 有一組。其中包括 n整數,除了的整數只有一次以外,其他已經出現3二級。如何找到只出現一次最快的數?作者的解法有點忘記了。可是這個題突然讓我想起之前 程式設計之美 裡的一道題,和這個題的差別是其它都出現2次,僅僅有乙個是出現一次。它的解法很巧妙。就是把...
利用位操作實現簡單的功能
位操作雖然會降低程式的可讀性,但是我想,熱衷於位操作的人大概都是被它的效率所吸引了。如果某些簡單但常用的功能可以利用位操作實現,且用位操作實現的 量相同或更少,我希望讓這些位操作得到普及。在介紹之前,先列舉一下位操作符 a b 按位與 a b 按位或 a b 按位異或 a 按位取反 aa b 有符號...
有很多使用位操作。
正如你所指出的,使用正態變數的作用域規則 如果語句塊內使用,它適用於所有的塊和子塊。無論你把它放在每個函式或全域性宣告它,它會影響你的整個計畫是非常個人的選擇。在全球更方便,但也增加了命名衝突的潛力。t可能有助於指出,由於一塊代替單個語句 即以分號結束 塊取代分號使用。沒有分號結束一塊是必要的。有更...