二進位制位運算主要有三種:
一. 1 & 0= 0,1 & 1= 1,0 & 0= 0
第一種與運算,即當兩者皆為1時結果為1,否則結果為0。
二. 1 | 1=1,1 | 0 = 1,0 | 0 = 0
第二種或運算,即當兩者有1時結果就為1,否則結果為0。
三. 1 ^ 0 = 1, 1 ^ 1 = 0 , 0 ^ 0 = 0
第三種抑或運算,即當兩者相異時,結果為1,否則為0。
位運算特性:a ^ 0 = a , a ^ a = 0,
a & (a-1)(去除a的最後一位1)
漢明重量:一組數中1的個數,如10011的漢明重量為3
漢明距離:兩個數中相異位數的個數,如10110與11001的漢明距離為4
1.漢明距離
問題描述:兩個整數之間的漢明距離指的是這兩個數字對應二進位制位不同的位置的數目。
給出兩個整數 x 和 y,計算它們之間的漢明距離。
示例:
輸入: x = 1, y = 4
輸出: 2
解釋:1 (0 0 0 1)
4 (0 1 0 0)
↑ ↑
上面的箭頭指出了對應二進位制位不同的位置。
思路:可先對兩個數字進行抑或的位運算,由於抑或運算的性質,兩數字相異的位數都變為了1,這時計算結果的1的個數即為兩數的漢明距離。
**實現:
def
hamminglength
(x,y)
: new = x ^ y
count =
0while new !=0:
new = new &
(new -1)
count+=
1return count
2.漢明距離總和
問題描述:兩個整數的 漢明距離 指的是這兩個數字的二進位制數對應位不同的數量。
計算乙個陣列中,任意兩個數之間漢明距離的總和。
示例:
輸入: 4, 14, 2
輸出: 6
解釋: 在二進位制表示中,4表示為0100,14表示為1110,2表示為0010。(這樣表示是為了體現後四位之間關係)
所以答案為:
hammingdistance(4, 14) + hammingdistance(4, 2) + hammingdistance(14, 2) = 2 + 2 + 2 = 6.
思路:
設最高位數為32位,外層迴圈為迴圈32次,內層迴圈迴圈給定的列表。設定res儲存最後的結果。內層設定兩個計數器分別計算1和0的個數,內層迴圈開始先將數向右移動i位(i位外層當前迴圈的次數),接著將當前的數與1進行與運算,根據與運算的性質,最後一位為1結果就是1,否則結果就為0。遍歷所有數後計數器儲存當前位數的0和1的個數。這時當前位數兩兩的漢明距離總和就為兩個計數器相乘。將這個結果儲存到最後的結果中,並開始下一次迴圈。最後輸出res。
**實現:
def
hamminglengthsum
(list)
: res=
0for i in
range(32
):count_0=
0 count_1=
0for j in
list:if
(j>>i)&1
: count_1+=
1else
: count_0+=
1 res=res+count_1*count_0
return res
3.只出現一次的數字
問題描述:給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
示例:
輸入: [2,2,1]
輸出: 1
輸入: [4,1,2,1,2]
輸出: 4
思路:根據抑或運算的性質,a ^ 0 = a, a ^ a = 0 ,b ^ (a ^ b) = a。
**實現:
def
singlenum
(list)
: res=
0for i in list:
res = res ^ i
return res
二進位制位運算
與運算,6 3 2 或運算 6 3 7 異或運算 6 3 5 反碼 6 7 左移 3 2 12 3 2 2 12 右移 3 1 1 3 2 1 無符號右移 3 1 1 3 2 1 按位與,當兩位同時為1時才為1如 1 1 1 1 0 0 0 1 0 6 3相當於 0110 0011 0010 2 按...
二進位制位運算
一 按位與 位全為1,結果才為1 0 0 0 0 1 0 1 0 0 1 1 1 特殊用法 清零。如果想將乙個單元清零,就是使其全部二進位制位為0,只要與乙個各位都為零的數值相與,結果為零 取乙個數中的指定位。如x 10101110要取x的低4位,用x 00001111 00001110即可 二 按...
位運算 顛倒二進位制位
a代表某字串 a b 異或 相同為0,不同為1 若b是一串0,則a b a,a b 0 a a 0 若b是一串1,則a b a,相當於把a取反,a b a a a a 利用x x 0,可以將三個數中重複的兩個數去掉 n 相當於無符號右移,左邊會補上0 獲取11111111,只需要把0取反 得到倒數第...