按位與運算子」&」是雙目運算子。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為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...