Python实现32位无符号整数二进制位反转问题及代码排查
如何正确反转32位无符号整数的二进制位?
我懂你遇到的问题了——你写的那段代码失效的核心原因,是忽略了32位无符号整数必须包含所有高位前导零这个要求。
你看,bin(n)返回的二进制字符串是不带前导零的,比如输入43261596时,bin(43261596)只会返回'0b10100101000001111010011100',直接反转bin(n)[:1:-1]的话,会丢掉原数高位的六个零,反转后的字符串长度不足32位,转成整数自然和预期结果不符。
下面给你两种靠谱的实现方式:
方法一:补全32位前导零后反转(直观易懂)
这种方法先把数字格式化为严格32位的二进制字符串,再反转转换,完全贴合题目要求:
def reverseBits(self, n): # 将n格式化为32位二进制字符串,不足位用前导零补全 full_32bit = format(n, '032b') # 反转字符串 reversed_bit = full_32bit[::-1] # 转回整数 return int(reversed_bit, 2)
测试你给的例子:输入43261596时,format会生成完整的'00000010100101000001111010011100',反转后得到'00111001011110000010100101000000',转成整数就是正确的964176192。
方法二:位运算逐位处理(高效性能优)
如果追求更高的性能,位运算的方式更适合,它不需要字符串转换,直接操作二进制位:
def reverseBits(self, n): result = 0 for _ in range(32): # 结果左移一位,腾出最后一位的位置 result <<= 1 # 取出n的最后一位,放到result的最后一位 result |= n & 1 # n右移一位,处理下一位 n >>= 1 return result
这个逻辑很清晰:循环32次(对应32位),每次把结果左移腾位置,然后把当前n的最低位取出来加到结果里,再让n右移一位处理下一位。不管原数有没有前导零,都能完整反转所有32位。
内容的提问来源于stack exchange,提问作者casillas
相关产品推荐
相关产品推荐

