我有一个(短)数据数组,该数组向左移4,它也是一个带符号的数字。我需要将其绘制在零附近。
例如,:如果数组中的数字为0b0000000011111111
,然后将其向左移动4,我将得到0b000000001111
。没事。
:如果数组中的数字为0b100011111111
,然后将其向左移动4,我将得到0b000010001111
。很好,但是现在它不是负数。
有人可以帮忙吗?
答案 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'