關於位運算

2021-07-31 04:19:43 字數 2786 閱讀 6752

主要**                

1.&如果兩個相應的二進位制位都為1,則該位的結果值為1;否則為0。

是二進位制「與」運算,參加運算的兩個數的二進位制按位進行運算,運算的規律是:

0 & 0=0

0 & 1=0

1 & 0=0

1 & 1=1

對於參加運算的數要換算為二進位制進行運算,例如3 & 2的結果是2,過程如下:

3 & 2

=0111 & 0010

=0010

=2

2. |

unsigned char a=5,b=11;

5 == 0000 0101 (二進位制)

10== 0000 1011

a | b== 0000 1111

| 是把某兩個數中, 只要其中乙個的某一位為1,則結果的該位就為1;

& 相反

3. << 向左移位移

4. >> 向右位移

5. ^ 異或

6 ~7 再扯下%

8.位運算優先順序

&簡單舉例:

11&3  = 3

&  00000011

=  00000011 = 3

&比較實用的例子:

比如我們經常要用的是否被2整除,一般都寫成  if(n % 2 == 0)

可以換成 if((n&1) == 0)

2. |

如果兩個相應的二進位制位只要有乙個是1,結果就是1;否則為0。

| 簡單例子:

11 | 3 = 11

|    00000011

=  00001011 = 11

| 比較實用的例子

可以用乙個unsigned int 來儲存多個布林值。比如乙個檔案有讀許可權,寫許可權,執行許可權。看起來要記錄3個布林值。我們可以用乙個unsigned int也可以完成任務。

乙個數r來表示讀許可權,它只更改個位來記錄讀許可權的布林值

00000001  (表示有讀許可權)

00000000  (表示沒有讀許可權)

乙個數w表示寫許可權,它只用二進位制的倒數第二位來記錄布林值

00000010 (表示有寫許可權)

00000000 (表示沒有寫許可權)

乙個數x表示執行許可權,它只用倒數第三位來記錄布林值

00000100 (表示有執行許可權)

00000000 (表示沒有執行許可權)

那麼乙個檔案同時沒有3種許可權就是

~r | ~ w | ~ x 即為 00000000,就是0

只有讀的許可權就是

r | ~w | ~x 即為 00000001,就是1

只有寫的許可權就是

~r | w | ~x 即為 00000010,就是2

乙個檔案同時有3種許可權就是

r | w | x 即為 00000111,就是7

3. << 向左移位移

《簡單例子(向左移一位,右邊自動補0)

11 << 1 = 22

00001011 << 1

00010110 = 22

相當於二進位制的每個數都變成當前值的兩倍,結果就是變成當前值的兩倍。

n * 2 == (n << 1)

推廣下就是(注意可能會溢位)

4. >> 向右位移

>>簡單例子(向右移一位,左邊自動補1)

11 >> 1 =  5

00001011 >> 1

00000101 = 5

注意到最後一位的1被乾掉了。

比較實用的例子是:

int n = n / 2    等價於  int n = n >> 1  等價於 int n >>= 1

5. ^ 異或

兩個相同的數會變成0,反之是1

例子:11^3 = 8

^  00000011

=  00001000 = 8

我覺得理解異或,一定要用異或來解下面的題目:

就是乙個陣列中,所有數字都出現了兩次,只有乙個沒有

比如 int t = 要找到5。

用異或就完美了,所有相同的都會消失,留下來的就是5了。我發現異或是嫉妒成雙成對的。

intsinglenumber(inta,intn)

returna[0];

}

還有就是用不tmp值來交換兩個數

//不用temp交換兩個整數

voidswap(int& x ,int& y)

扯點別的,^在lua中表示pow的意思,這是要逆天。

6 ~這個在加法中用到

x-y = x + ~y + 1

所以~y = – y  -1

比如 ~11 = -11 -1 = -12

7 再扯下%

居然有道題目是這樣的: 求 100 % 8的 優化解法。我們知道:

8剛好是2的3次方

所以 100 % 8 == 100 – math.floor(100 / 8) * 8 == 100 -  ((100 >> 3) << 3)

8.位運算優先順序

總的來說比較低,一定要加括號。

關於位運算

今天看k神的一篇題解,看到一些關於位運算的技巧。又想起以前學長川哥給的一篇位運算對集合處理的技巧的pdf。所以就一起整理一下。各種位運算子的功能就不累述了。集合的位運算表示 來自川哥給的pdf 基本表示 1.空集 0 2.全集 1 3.只含有第 i 個元素的集合1 集合間的操作 1.s 與 t 的並...

關於位運算

9月21日,對本文從格式到部分內容上都進行了修改 今天看了一位師兄去年的筆經總結,其中有一題是 不許用 和 來實現求任意數除以3的餘數 我想考官的目的應該是想考察學生對位運算的熟悉程度吧,於是我把題目擴充套件成 只能用 和位運算實現正整數除法 和取模 注意 這裡不能使用其它的庫例程來輔助計算,如lo...

關於 位運算

位運算 位運算是把數字用二進位制表示之後,對每一位上0或者1的運算。理解位運算的第一步是理解二進位制。二進位制是指數字的每一位都是0或者1.比如十進位制的2轉化為二進位制之後就是10。在程式設計師的圈子裡有乙個流傳了很久的笑話,說世界上有10種人,一種人知道二進位制,而另一種人不知道二進位制。其實二...