1、循环,位运算
class Solution:
def reverseBits(self, n: int) -> int:
# 循环 res为结果,每次循环左移并和n当前位(n&1)做或运算,n右移
res = 0
for i in range(32):
res = (res<<1) | (n&1)
n >>= 1
return res
2、分治法
class Solution:
def reverseBits(self, n: int) -> int:
# 分治法
# 每隔1个交换
# 0xaaaaaaaa = (1010 1010 1010 1010 1010 1010 1010 1010)b
# 0x55555555 = (0101 0101 0101 0101 0101 0101 0101 0101)b
# 每隔2个交换
# 0xcccccccc = (1100 1100 1100 1100 1100 1100 1100 1100)b
# 0x33333333 = (0011 0011 0011 0011 0011 0011 0011 0011)b
# 每隔4个交换
# 0xf0f0f0f0 = (1111 0000 1111 0000 1111 0000 1111 0000)b
# 0x0f0f0f0f = (0000 1111 0000 1111 0000 1111 0000 1111)b
# 每隔8个交换
# 0xff00ff00 = (1111 1111 0000 0000 1111 1111 0000 0000)b
# 0x00ff00ff = (0000 0000 1111 1111 0000 0000 1111 1111)b
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