位操作导致无符号大数而不是负数

时间:2015-02-27 07:07:01

标签: python bit-manipulation

>>> result = 0
>>> x = -2
>>> 
>>> for i in range(32):
...     c = 1 << i
...     if c & x: result |= c
... 
>>> print(result)
4294967294

如您所见,预期结果应为-2,但程序会打印4294967294,这是负数的二进制补码表示。

如何解决?在python中有signed integer吗?

非常感谢!

2 个答案:

答案 0 :(得分:3)

Python(甚至是Python 2)不强制执行整数子类型。你可以循环到48(而不是)32,Python会自动将数字转换为long,你会得到281474976710654L。如果你在Python 2.x上打印repr(result)会更明确,因为你会4294967294L显示转换为long

知道你想要的是一个带符号的32位整数,但Python不知道它。你所能做的只是一个明确的转换:

if result > 0x7fffffff: result = int(result - 0x100000000)

int转换强制在Python 2.x下从long转换为int

答案 1 :(得分:0)

我只看到3种可能性

  1. 结果变量超过32位

    • 尝试范围(64)....
  2. 结果变量是unsigned int而不是signed

    • 不在python中编码所以我不知道如何声明/定义变量
    • 所以请记住这一点
  3. 结果变量是任意大小(大整数)

    • 在这种情况下,无论什么
    • ,您的方法都无效
    • 需要单独处理标志......
    • 所以范围(位-1)
    • 并添加如下内容:
    • sx=x; if (x<0) x=-x; ...在循环之前
    • if (sx<0) result=-result; ...循环后