LeetCode-190:翻转整数的二进制位(Reverse Bits)

这篇博客介绍了LeetCode的第190题,要求翻转一个32位无符号整数的二进制位。提供了两种分析思路:通过右移和赋值操作翻转,以及逐级对调相邻位。同时给出了Python实现代码,并给出了多个参考链接以供深入学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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.youkuaiyun.com/sunao2002002/article/details/45652165
  2. https://blog.youkuaiyun.com/gqtcgq/article/details/50533183
  3. https://blog.youkuaiyun.com/liyuanbhu/article/details/51183010
  4. https://blog.youkuaiyun.com/xiaoyi357/article/details/59484309
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值