位運算小結及位運算題目小練

2021-09-24 02:37:00 字數 3289 閱讀 2300

按位與運算子」&」是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1,否則為0。參與運算的數以補碼方式出現。

運算規則:

0 & 0 =0

0 & 1 = 0

1 & 0 = 0

1 & 1 = 1

舉例:

9(00001001) & 5(00000101) = 1 (00000001)

00001001 &

00000101

-----------

00000001

按位或運算子「|」是雙目運算子。功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有乙個為1時,結果位就為1。參與運算的兩個數均以補碼出現。

9(00001001) | 5(00000101) = 13 (00001101)

00001001 |

00000101

----------

00001101

求反運算子~為單目運算子,具有右結合性。其功能是對參與運算的數的各二進位按位求反。

~(101010101) =010101010

按位異或運算子 ^ 是雙目運算子。其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。參與運算數仍以補碼出現。

9(00001001) ^ 5(00000101) = 12 (00001100)

00001001 ^

00000101

----------

00001100

在c++11中沒有設定同或運算子,但是同或是異或的反,求a同或b,首先計算a ^ b,然後取反,便可以得到a同或b。

9(00001001) 同或 5(00000101) = 243 (11110011)

~(00001001 ^

00000101

----------

00001100

)----------

11110011

與運算是二元邏輯運算子,不針對二進位制,而是針對實際的值。任何數和0做與運算都為0,兩個運算元都不為0,做與運算的結果才不為0。

1 && 1 =1

0 && 1 = 0

或運算是二元邏輯運算子,不針對二進位制,而是針對實際的值。任何數和1做與運算都為1,兩個運算元都為0,做與運算的結果才為0。

0

|| 0 = 0

0|| 1 = 1

非運算是一元邏輯運算子,不針對二進位制,而是針對實際的值。1的非是0,0的非是1。

!0 = 1

!1 = 0

左移運算子 << 是雙目運算子。左移 n 位就是乘以 2 的 n 次方。其功能把 << 左邊的運算數的各二進位全部左移若干位,由 << 右邊的數指定移動的位數,高位丟棄,低位補0。

對左移而言,正數和負數的移動規則是相同,對於乙個有符號正數,如果左移的位數較大,可能得到的結果會變成負數(溢位)。對於無符號數,如果左移的位數較大,得到的結果可能會比原數要小(溢位)。

有符號右移運算 >> 是雙目運算子,按二進位制形式把所有的數字向右移動對應的位數,低位移出(捨棄),高位的空位補符號位,即正數補零,負數補1。

語法格式:

需要移位的數字 >> 移位的次數,例如11 >> 2,則是將數字11右移2位

計算過程:

11的二進位制形式為:0000 1011,然後把低位的最後兩個數字移出,因為該數字是正數,所以在高位補零。則得到的最終結果是0000 0010。轉換為十進位制是2。

數學意義:

右移一位相當於除2,右移n位相當於除以2的n次方。這裡只取商,餘數直接捨棄。

運算規則:

按二進位制形式把所有的數字向右移動對應位數,低位移出(捨棄),高位的空位補零。對於正數來說和帶符號右移相同,對於負數來說不同。 其他結構和 >> 相似。

1、因為位運算比乘法運算快,所以可將x = x * 2 優化為x = x << 1。

2、利用左移運算子計算 a 的第 b 個二進位制位是什麼:a & (1 << b)。

3、不適用臨時變數交換a、b兩個數:

a = a ^ b;

b = a ^ b;

a = a ^ b;

4、統計整數num的二進位制表示中的1的個數,利用的是num & (num - 1)會將num的二進位制表示的最後一位的1變成0。

return

count;}

5、判斷乙個數是不是power of two。原理和第4題是相同的。

int fun(int num)

6、判斷乙個32位整數是不是4的冪,首先判斷是不是power of two,如果不是,那麼這個數肯定不是4的冪,否則的話和0x55555555做按位與運算,如果得到的結果和原來的數相同,這個數就是乙個4的冪。這樣做的原理是,0x55555555是乙個32位的整形數字,並且在它的二進位制表示中,奇數字全部都是1,而powers of 4的二進位制中只有乙個1存在,並且這個1僅僅存在於奇數字上。所以如果number是power of 2,並且(number & 0x55555555) == number,那麼number一定是乙個power of 4。

bool detect(int number)

7、判斷輸入的兩個數m、n的二進位制位上有多少位不同,首先m和n做按位異或運算,將二者的二進位制表示的不相同的部分置1,相同的部分置0,得到乙個數diff,然後統計diff的二進位制表示中有多少位1。

int differences(int m, int n)

return

count;

}

8、只是用位運算完成整數相加

int add(int num1, int num2)

while(num2 != 0);

return

sum;

}

按位與運算子」&」是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1,否則為0。參與運算的數以補碼方式出現。

運算規則:

位運算題目

今天看到牛客網的一些題目,非常經典。解法基本也都很熟悉,所以特地做個總結,後續慢慢補充。先上題目 數字中的二進位制有多少個1 這裡的數字並不關心它的符號,所以即便是負數,只需要得到二進位制中1的個數就可以了。但是在python中,對於負數的右移運算,符號位會保留,這樣在執行迴圈語句的右移操作時,首位...

位運算題目彙總

給你乙個整數陣列 arr 請你將陣列中的元素按照其二進位制表示中數字 1 的數目公升序排序。如果存在多個數字二進位制中 1 的數目相同,則必須將它們按照數值大小公升序排列。請你返回排序後的陣列。輸入 arr 0 1,2 3,4 5,6 7,8 輸出 0,1,2,4,8,3,5,6,7 解釋 0 是唯...

leetcode 位運算題目彙總 上)

最近在看位運算的知識,十分感嘆於位運算的博大精深,正好leetcode有 bit manipulation 的專題,正好拿來練練手。給出乙個由不同的數字組成的陣列,列舉它的子陣列 子集 這道題我之前用遞迴解過,而且效率還不錯 beat 83.33 解法如下不加詳述了 param nums retur...