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取反
得到倒數第n位為1,只需要把1左移n-1位
輸入: 00000010100101000001111010011100
輸出: 00111001011110000010100101000000
解釋: 輸入的二進位制串 00000010100101000001111010011100 表示無符號整數 43261596,
因此返回 964176192,其二進位制表示形式為 00111001011110000010100101000000。
對於二進位制位,不需要迴避,基本的運算,取餘或者&都可以撈出來二進位制表示中的每一位。
下面的解法就是把每一位撈出來,然後左移再異或,相當於搬運這一位。 n = n >> i
第二種解法是:class
solution
:def
reversebits
(self, n)
:# 檢查最右邊的一位是通過取餘%
m =31 reverse =
0for i in
range(31
,-1,
-1):
# 注意 一共有32個數,所以一定有32次比對。
# 並且,對於二進位制位,不需要迴避,基本的運算,取餘或者&都可以撈出來。
result = n &
1 n = n >>
1 result = result << i
reverse ^
= result
return reverse
這種解法相當於分塊,每一塊實現一次顛倒,再不斷顛倒直到全部結束。0x指的是16進製制。 | 或 !!!!very good
實現了時間複雜度和空間複雜度位o(1)。
第一步也可以n = ((n & 0xffff0000) >> 16) | ((n & 0x0000ffff) << 16)。class
solution
:# @param n, an integer
# @return an integer
defreversebits
(self, n)
: n =
(n >>16)
|(n <<16)
n =((n &
0xff00ff00
)>>8)
|((n &
0x00ff00ff
)<<8)
n =((n &
0xf0f0f0f0
)>>4)
|((n &
0x0f0f0f0f
)<<4)
n =((n &
0xcccccccc
)>>2)
|((n &
0x33333333
)<<2)
n =((n &
0xaaaaaaaa
)>>1)
|((n &
0x55555555
)<<1)
return n
leetcode 顛倒二進位制位
顛倒給定的 32 位無符號整數的二進位制位。示例 輸入 43261596 輸出 964176192 解釋 43261596 的二進位制表示形式為 00000010100101000001111010011100 返回 964176192,其二進位制表示形式為 00111001011110000010...
190 顛倒二進位制位
題目描述 顛倒給定的 32 位無符號整數的二進位制位。示例 1 輸入 00000010100101000001111010011100 輸出 00111001011110000010100101000000 解釋 輸入的二進位制串 00000010100101000001111010011100 表...
190顛倒二進位制位(位運算 分治思想)
1 題目描述 顛倒給定的 32 位無符號整數的二進位制位。2 示例 輸入 00000010100101000001111010011100 輸出 00111001011110000010100101000000 解釋 輸入的二進位制串 00000010100101000001111010011100...