代码之家  ›  专栏  ›  技术社区  ›  zs2020

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

  •  2
  • zs2020  · 技术社区  · 10 年前
    >>> result = 0
    >>> x = -2
    >>> 
    >>> for i in range(32):
    ...     c = 1 << i
    ...     if c & x: result |= c
    ... 
    >>> print(result)
    4294967294
    

    如您所见,预期结果应该是 -2 ,但是程序打印 4294967294 ,这是负数的两个补码表示。

    如何修复?还有吗 signed integer 在python中?

    非常感谢!

    2 回复  |  直到 10 年前
        1
  •  3
  •   Serge Ballesta    10 年前

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

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

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

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

        2
  •  0
  •   Spektre    10 年前

    我只看到3种可能性

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

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

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

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