位運算 顛倒二進位制位

2021-10-09 10:17:31 字數 1765 閱讀 7745

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)。

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

第一步也可以n = ((n & 0xffff0000) >> 16) | ((n & 0x0000ffff) << 16)。

leetcode 顛倒二進位制位

顛倒給定的 32 位無符號整數的二進位制位。示例 輸入 43261596 輸出 964176192 解釋 43261596 的二進位制表示形式為 00000010100101000001111010011100 返回 964176192,其二進位制表示形式為 00111001011110000010...

190 顛倒二進位制位

題目描述 顛倒給定的 32 位無符號整數的二進位制位。示例 1 輸入 00000010100101000001111010011100 輸出 00111001011110000010100101000000 解釋 輸入的二進位制串 00000010100101000001111010011100 表...

190顛倒二進位制位(位運算 分治思想)

1 題目描述 顛倒給定的 32 位無符號整數的二進位制位。2 示例 輸入 00000010100101000001111010011100 輸出 00111001011110000010100101000000 解釋 輸入的二進位制串 00000010100101000001111010011100...