如何使Python将十六进制数看作补码形式?

3

我有一个十六进制正数和负数的数组。我想将它们转换为十进制值:

>>> int("f107",16)
61703
>>> 

如何让Python将f107看作二进制补码呢?换句话说,我想要的是-3833,而不是61703。该怎么做呢?

2个回答

4

这是一个非常简单的功能:

def twos_complement(n, w):
    if n & (1 << (w - 1)): n = n - (1 << w)
    return n

例子:

>>> twos_complement(61703, 16)
-3833

与Joran的回答不同,此方法支持任意位宽。

1
很棒的答案 :) 尽管你仍然需要传入宽度(我认为你可以用对数和其他方法来计算它)... 但是很酷的是你可以使用奇怪的非标准宽度。 - Joran Beasley
如果您的函数以 "f107" 十六进制字符串作为其参数,则可以计算所需位掩码的宽度... - PM 2Ring
@PM2Ring,你可以使用这个函数来构建那个函数,但反过来不行 :) 这个更通用。 - orlp
3
一个二进制补码数有一个宽度,比如32位或16位。你在问题中提供的数字是一个16位的数。这个数的实际值取决于它的宽度。 - orlp
1
@Abraham:在Python中做这些事情有点棘手。与C不同,C中有各种固定大小的整数,而Python的整数是任意大小的:它们可以很大。因此,当您想要使用某种补码表示负数时,需要指定宽度。 - PM 2Ring
显示剩余2条评论

3
struct.unpack(">h","f107".decode("hex"))

0xf107 = encode_to_bytes => "\xf1\x07"

由于它是两个字节,我们可以将它解包为>大端h有符号短整数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接