将 python 整数转换为其带符号的二进制表示形式
convert python integer to its signed binary representation
给定一个正整数,例如 171 和一个 "register" 尺寸,例如8.
我想要由 171 的二进制表示形式表示的整数,即 '0b10101011' 解释为二进制补码。
在本例中,171 应变为 -85。
它是负数,因为给定 "register" 大小 8,MSB 为 1。
我希望我能解释我的问题。
我该如何进行这种转换?
我尝试了什么:
size = 8
value = 171
b = bin(value)
if b[len(b)-size] == '1':
print "signed"
# What to do next?
可能有一百种不同的方法可以做到这一点。这里有一对。
如果大小是 8 的倍数,那么像这样的东西就可以完成工作:
x = int.from_bytes(value.to_bytes(size // 8, byteorder='big'), byteorder='big', signed=True)
如果大小不是8的倍数,那么你可以这样做:
mask = 1 << (size - 1)
x = (value ^ mask) - mask
两者都假设该值不会太大而无法放入 "register"。
您不需要二进制转换来实现:
>>> size = 8
>>> value = 171
>>> unsigned = value % 2**size
>>> signed = unsigned - 2**size if unsigned >= 2**(size-1) else unsigned
>>> signed
-85
给定一个正整数,例如 171 和一个 "register" 尺寸,例如8.
我想要由 171 的二进制表示形式表示的整数,即 '0b10101011' 解释为二进制补码。
在本例中,171 应变为 -85。 它是负数,因为给定 "register" 大小 8,MSB 为 1。
我希望我能解释我的问题。 我该如何进行这种转换?
我尝试了什么:
size = 8
value = 171
b = bin(value)
if b[len(b)-size] == '1':
print "signed"
# What to do next?
可能有一百种不同的方法可以做到这一点。这里有一对。
如果大小是 8 的倍数,那么像这样的东西就可以完成工作:
x = int.from_bytes(value.to_bytes(size // 8, byteorder='big'), byteorder='big', signed=True)
如果大小不是8的倍数,那么你可以这样做:
mask = 1 << (size - 1)
x = (value ^ mask) - mask
两者都假设该值不会太大而无法放入 "register"。
您不需要二进制转换来实现:
>>> size = 8
>>> value = 171
>>> unsigned = value % 2**size
>>> signed = unsigned - 2**size if unsigned >= 2**(size-1) else unsigned
>>> signed
-85