【问题标题】:Python Bitwise Shift doesn't work as expectedPython Bitwise Shift 无法按预期工作
【发布时间】:2014-07-07 18:49:45
【问题描述】:

这是我的代码

http://pastebin.com/xRAS7qLH

这会创建一个无限循环,所以不要运行它。

        intMask = 0
        while(temp != 0):
            print bin(temp)[2:].zfill(32)
            temp = long(temp << 1)
            intMask += 1

当我查看输出时,它看起来像这样

11111111111111111111111100000000

111111111111111111111111000000000

1111111111111111111111110000000000

我期待的是更像这样的东西

11111111111111111111111100000000

11111111111111111111111000000000

11111111111111111111110000000000

python 一定有什么不同,还是我需要进行类型转换?我在这里错过了什么?

【问题讨论】:

  • 为什么不创建一个 SSCCE (sscce.org) 并发布它呢?

标签: python binary bit-manipulation shift


【解决方案1】:

Python 的整数具有任意精度,除了难以拼写之外,这意味着当您进行位移时,它会不断变大。如果你想限制大小,你会想做类似的事情

temp = long(temp << 1) & (0xffffffff)

应该归零。

编辑:具体来说, & 执行按位与; 0xffffffff(8 个 f)是 32 个 1(二进制),因此 32 位内的任何内容都将被保留;超出的任何内容都将设置为零)。有关更多详细信息,您可以执行以下操作:

temp = long(temp

【讨论】:

  • 好的,但是你能解释一下为什么吗?我不明白为什么会这样。
  • 我还发现,我可以执行以下 math.log( x ) / math.log (2) ,而不是执行 while 循环,这给了我相同的值
  • 如果你想找到所需的位数,我希望代码高尔夫有各种“有趣”的方法来做到这一点
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
相关资源
最近更新 更多