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

参考
  1. https://blog.csdn.net/sunao2002002/article/details/45652165
  2. https://blog.csdn.net/gqtcgq/article/details/50533183
  3. https://blog.csdn.net/liyuanbhu/article/details/51183010
  4. https://blog.csdn.net/xiaoyi357/article/details/59484309

猜你喜欢

转载自blog.csdn.net/qq_36653505/article/details/82014519
今日推荐