题目描述
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位。