【问题标题】:Reverse bits program logic not clear反转位程序逻辑不清楚
【发布时间】: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 我确实知道什么是 % 和 / 运算符,但我在这里不明白的是它如何帮助反转整数位。

标签: python reverse bit


【解决方案1】:

位移类似于您的字符串连接,binary = binary + str(n%2) 有效地将已经存在的字符向左移动一个位置(类似于result &lt;&lt;= 1)。因为对于位移方法,这将在末尾添加一个0,如果当前n 的最后一个二进制数字是1 (result += 1),他们需要选择性地将值增加1。然后n &gt;&gt;= 1n //= 2 一样。

第二种方法基本上需要额外的 32 位 result(至少理论上是这样),而字符串方法最终会得到一个使用大约 32 个字节的 32 个字符的字符串。整数运算也可能比字符串运算更快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-07
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-04
    • 1970-01-01
    相关资源
    最近更新 更多