【问题标题】:bitwise operation and Two's complement in pythonpython中的按位运算和二进制补码
【发布时间】:2018-08-08 07:17:59
【问题描述】:

我有一个(短)数据数组,它向左移动了 4,它也是一个有符号数。我需要将它绘制在零附近。

例如:如果数组中的数字是0b0000000011111111,我将它左移4,我将得到0b000000001111。没事。

例如:如果数组中的数字是0b100011111111,我将它向左移动4,我将得到0b000010001111。很好,但现在不是负数了。

有人可以帮忙吗?

【问题讨论】:

  • 您的问题不清楚。在这两种情况下,您都说“向左移动”,但它看起来像是向 right 移动(向最低有效位)。你的意思是“向右移动”?另外,问题本身也不清楚。你想移动负数并仍然得到一个负数吗?另外,你如何进行轮班?数字的数据格式是什么--16 位整数?它属于什么类型的变量?
  • 我能想到的唯一解决方案是在转换之前将它们转换为正数,然后再转换为负数。 This wikipedia page 很好地解释了两个人的恭维是如何工作的。
  • Python 在其整数中不使用二进制补码,0b10001111111 == 2303
  • @jonrsharpe 仅供参考,您最后缺少1 (0b100011111111)。

标签: python twos-complement


【解决方案1】:

如果您需要的话,您必须编写自己的 16 位值的算术右移实现。我建议你这个,很容易理解:

def arithmetic_right_shift_on_16_bits(val, n):
    # Get the sign bit
    s = val & 0x8000
    # Perform the shifts, padding with the sign bit
    for _ in range(n):
        val >>= 1
        val |= s
    return val

a = arithmetic_right_shift_on_16_bits(0b0000000011111111, 4)
print(bin(a)) # 0b1111

b = arithmetic_right_shift_on_16_bits(0b1000000011111111, 4)
print(bin(b)) # 0b1111100000001111

【讨论】:

    【解决方案2】:

    这在 Python 中不会发生:

    >>> bin(0b0000000011111111 >> 4)  # 15
    '0b1111'
    >>> bin(0b100011111111 >> 4)  # 143
    '0b10001111'
    

    【讨论】:

      【解决方案3】:

      顺便说一句,您作为负短整数示例显示的数字不是 1,因为您只给出了 12 位。所以我假设感兴趣的数量是0b1000000011111111。由于 Python 不使用 2 的补码,因此显示为 33023。但是您可以手动进行 2 的补码:对于短整数(16 位),您只需将数字减去 0x10000。

      然后你可以写:

      def short_signed_right_shift(x, i):
          if x < 0 or x >= 0x10000: raise ValueError   # only accept 16 bits numbers
          return x >> i if (x < 0x7FFF) else 0x10000 + ((x - 0x10000) >> i)
      

      然后你就可以使用它了:

      >>> bin(short_signed_right_shift(0b0000000011111111, 4))
      '0b1111'
      >>> bin(short_signed_right_shift(0b1000000011111111, 4))
      '0b1111100000001111'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-08
        • 1970-01-01
        • 1970-01-01
        • 2018-03-25
        相关资源
        最近更新 更多