【发布时间】:2021-12-29 05:49:12
【问题描述】:
我被要求编写一个反转给定 32 位无符号整数位的程序。
例如,如果输入是43261596,那么输出应该是964176192(输入的二进制是00000010100101000001111010011100,反转后输出是00111001011110000010100101000000,十进制相当于9641761
我写了以下程序:
class Solution:
def reverseBits(self, n: int) -> int:
binary = ""
for i in range(32):
binary = binary + str(n%2)
n = n//2
return int(binary,2)
提交后,收到的答案是“声称更节省时间和空间”的替代解决方案。这是另一种选择:
class Solution:
def reverseBits(self, n: int) -> int:
if (n == 0):
return 0
result = 0
for i in range(32):
result <<= 1
if ((n & 1) == 1):
result +=1
n >>= 1
return result
他们提供的逻辑是左/右移位。
我完全不知道向左/向右移位如何帮助反转十进制整数的位。为了进一步澄清,我自己写了这个sn-p:
a = 9
print(a>>1,a<<1)
输出分别为 4 和 18(整数减半和加倍)。
但是这个概念是如何影响整数位反转的呢?还有为什么这被认为比我的解决方案更节省时间和空间?请帮忙。
【问题讨论】:
-
您最初的解决方案是使用减半和模 2 运算,所以您似乎知道它有何帮助?
-
您的代码示例都不符合指令“输入必须是长度为 32 的二进制字符串。”。请举例说明 inut 和预期输出应该是什么样的
-
@BrutusForcus 我已经用输入/输出示例编辑了这个问题。
-
另一种方法是将位表示转换为字符串,将其反转并解析回十进制。非常简短:
int(f"{n:032b}"[::-1], 2)其中n是输入数字 -
@bereal 我确实知道什么是 % 和 / 运算符,但我在这里不明白的是它如何帮助反转整数位。