产生无符号大数而不是负数的位运算

Bit operations resulting in an unsigned large number instead of a negative number

>>> 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吗?

非常感谢!

我只看到 3 种可能性

  1. 结果变量超过 32 位长

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

    • 不要在python中编码,所以我不知道变量如何declared/defined
    • 所以要考虑到这一点
  3. 结果变量为任意大小(大整数)

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

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

的转换

知道你要的是一个带符号的32位整数,但是Python不知道。您所能做的就是显式转换:

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

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