190. 颠倒二进制位
题目
方法1:
利用位运算来操作,
仔细看下代码,看看怎么做的:
class Solution:
def reverseBits(self, n: int) -> int:
ans = 0
mi = 31
while n:
# 注意这里&表示与运算,比直接对2求余要算的更快
ans += (n&1)<<mi
mi -= 1
# 这里使用>>右移运算,比直接对2整除算的更快
n = n>>1
return ans
方法2:
分治的方法
我们可以通过以下步骤实现该算法:
首先,我们将原来的 32 位分为 2 个 16 位的块。
然后我们将 16 位块分成 2 个 8 位的块。
然后我们继续将这些块分成更小的块,直到达到 1 位的块。
在上述每个步骤中,我们将中间结果合并为一个整数,作为下一步的输入。
看一下,下面的代码中的位运算,左移右移和或操作相结合,刚好可以颠倒一个二进制数:
class Solution:
# @param n, an integer
# @return an integer
def reverseBits(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