首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 2的补码转换

Python 2的补码转换
EN

Stack Overflow用户
提问于 2019-01-22 04:54:46
回答 1查看 47关注 0票数 0

我有一些来自我的气象站的二进制数据,我需要转换成十进制。我必须合并2个字节,然后右移4。目前我这样做:

代码语言:javascript
复制
byte1 = 251
byte2 = 74
result = (byte1 * 256 + byte2) >> 4
print(result)

当输入的数据是正数时,这很好用,但是当它是负数时,它是2的补码格式,并且上面的代码不能正确地处理它。结果是4020,但我想要-76。

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

EN

回答 1

Stack Overflow用户

发布于 2019-01-22 05:37:35

尝试:

代码语言:javascript
复制
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,所以您可以这样做:

代码语言:javascript
复制
byte_mask = ~0xFFFF

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

如果您的传入byte1大于128 (因此是一个负数),我们只需对您的byte1byte2数进行OR运算,即可得到中间结果:

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

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

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

这是您想要的值:-76

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54297651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档