产生无符号大数而不是负数的位运算
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 种可能性
结果变量超过 32 位长
- 尝试范围 (64) ....
结果变量是 unsigned int 而不是 signed
- 不要在python中编码,所以我不知道变量如何declared/defined
- 所以要考虑到这一点
结果变量为任意大小(大整数)
- 在这种情况下,您的方法无论如何都行不通
- 需要单独处理签名...
- 所以范围(位-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)
>>> 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 种可能性
结果变量超过 32 位长
- 尝试范围 (64) ....
结果变量是 unsigned int 而不是 signed
- 不要在python中编码,所以我不知道变量如何declared/defined
- 所以要考虑到这一点
结果变量为任意大小(大整数)
- 在这种情况下,您的方法无论如何都行不通
- 需要单独处理签名...
- 所以范围(位-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)