位操作的簡單使用

2021-07-30 18:29:08 字數 1368 閱讀 1861

首先列舉出以下幾個常用的位操作符

&(與) ,|(或),~(非),^(異或),<<(左移),>>(右移)

作用:

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可能有助於指出,由於一塊代替單個語句 即以分號結束 塊取代分號使用。沒有分號結束一塊是必要的。有更...