产生无符号大数而不是负数的位操作

2024-04-26 15:00:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

非常感谢!在


Tags: in程序forifrangeintegerresultsigned
2条回答

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

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

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

(在python2.x下,int转换强制从long转换为int)

我只看到三种可能性

  1. 结果变量的长度超过32位

    • 尝试范围(64)。。。。在
  2. 结果是无符号变量而不是有符号变量

    • 不要用python编写代码,所以我不知道变量是如何声明/定义的
    • 所以在处理这件事的时候要记住这一点
  3. 结果变量为任意大小(big int)

    • 在这种情况下,无论怎样,你的方法都不会奏效
    • 需要单独处理标志。。。在
    • so范围(位-1)
    • 并添加以下内容:
    • sx=x; if (x<0) x=-x;。。。在循环之前
    • if (sx<0) result=-result;。。。循环后

相关问题 更多 >