问题描述
我有这样的对:(-102,-56),(123,-56)。对中的第一个值表示低 8 位,第二个值表示高 8 位,均为有符号十进制形式。我需要将这些对转换为单个 16 位值。
我想我可以通过以下方式转换 (-102,-56) 对:
l = bin(-102 & 0b1111111111111111)[-8:]
u = bin(-56 & 0b1111111111111111)[-8:]
int(u+l,2)
但是当我尝试对 (123,-56) 对执行相同操作时,出现以下错误:
ValueError: invalid literal for int() with base 2: '11001000b1111011'
。
我知道这是由于不同值的长度不同,我需要将它们填充到 8 位。
我这样做是完全错误的吗?这样做的最佳方法是什么,以便它同时适用于负值和正值?
更新: 我能够通过以下方式解决此问题:
low_int = 123
up_int = -56
(low_int & 0xFF) | ((up_int & 0xFF) << 8)
解决方法
您可以尝试将第一个值移动 8 位:尝试使用此处描述的逻辑 https://stackoverflow.com/a/1857965/8947333
,只是猜测
l,u = -102 & 255,-56 & 255
# shift 8 bits to left
u << 8 + l
,
按位运算可以,但不是严格要求。
在最常见的 8 位 2 的补码表示中:
-1 signed == 255 unsigned
-2 signed == 254 unsigned
...
-127 signed = 129 usigned
-128 signed = 128 usigned
简单地说,两个绝对值总和为 256。
使用它来转换负值:
if b < 0:
b += 256
然后组合高低字节:
value = 256 * hi8 + lo8