LeetCode-190:翻轉整數的二進位制位(Reverse Bits)
題目描述
Reverse bits of a given 32 bits unsigned integer.
For example, given input 43261596 (represented in binary as 00000010100101000001111010011100), return 964176192 (represented in binary as 00111001011110000010100101000000).
Follow up:
If this function is called many times, how would you optimize it?
分析1:
分析:
題目要求將一個整數的二進位制翻轉,如0x00000001 翻轉成0x10000000。這個與10進的翻轉類似。
將32位的無符號整數n右移32次,每次移動取出最低位,賦值給另一個變數result, 對應於n的右移,result對應地左移32次。(result需要先右移,再將n的最低位賦值給result,否則當輸入n=2147483648時,會溢位)
實現(python)
def reverseBits(value):
print(bin(value))
result = 0
for i in range(32):
# 取最後一位,然後左移
tem = value & 0x01
value >>= 1
# 先左移一位,與上最後一位
result = (result << 1) | tem
print(bin(result))
return result
分析2
一個無符號的整數,如果需要翻轉其二進位制位,可以採用下面的方法,以32位整數為例:
第1步:對調相鄰的1位(abcd efgh-> badc fehg)
python
v = ((v >> 1) & 0x55555555) | ((v & 0x55555555)<< 1)
第2步:對調相鄰的2位(abcd efgh-> cdab ghef)
python
v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4)
第3步:對調相鄰的4位(abcd efgh-> efgh abcd)
python
v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4)
第4步:對調相鄰的8位(相鄰的位元組)
python
v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8)
第5步:對調相鄰的16位(相鄰的兩位元組)
python
v = ( v >> 16) | (v << 16)
經過上面的步驟,一個32位整數的二進位制位已經翻轉了。上面的對調步驟是互不干擾的,因此順序可以倒過來,也就是先對調相鄰16位,然後是8位、4位、2位和1位。