python中的按位运算和二进制补码

时间:2018-08-08 07:17:59

标签: python twos-complement

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

例如,

:如果数组中的数字为0b0000000011111111,然后将其向左移动4,我将得到0b000000001111。没事。

例如,

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

有人可以帮忙吗?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

这在Python中不会发生:

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

答案 2 :(得分:0)

顺便说一句,您以负短整数为例显示的数字不是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'