Python 2的补码转换

时间:2019-01-21 20:54:46

标签: python binary

我从气象站获得了一些二进制数据,需要将其转换为十进制。我必须合并2个字节,然后右移4个。目前,我这样做如下:

byte1 = 251
byte2 = 74
result = (byte1 * 256 + byte2) >> 4
print(result)

当传入数据为正数时,此方法工作正常,但为负数时,它为2的补码格式,并且上面的代码无法正确处理它。结果是4020,但我要-76。

如何使它正确处理2的补码?

1 个答案:

答案 0 :(得分:1)

尝试:

byte1 = 251
byte2 = 74

byte_mask = ~0xFFFF

if (byte1>=128):
    result = ( ((byte1 << 8) + byte2) | byte_mask ) >> 4
else:
    result = ((byte1 << 8) + byte2) >> 4

更多详细信息:

我们都知道2的补码是什么...如果最左边的位是1,则数字是负数,我们应该执行2的补码来获得数字。那是容易的部分。困难的部分是您正在使用Python工作。 Python的编号既是福也是祸,因为Python的编号是无限的(大致而言)。我们需要以某种方式将无限数的所有最左位设置为1,这样您就可以做到:

byte_mask = ~0xFFFF

现在byte_mask是1111 1111 1111 1111 1111 1111 ..... 0000 0000 0000 0000

如果您传入的byte1大于128(因此为负数),我们对您的byte1byte2数进行“或”运算,得到中间结果:

1111 1111 1111 1111 ..... 1111 1011 0100 1010

显然,这更接近我们想要的东西。然后向右移动4。(当我们向右移动时,最左边的4位数字当然会用1填充):

1111 1111 1111 1111 ..... 1111 1111 1011 0100

您想要的是小数形式的-76