从十六进制到Python中的补码

10

在Python中有没有简单的方法来产生补码?

例如,如果您取十六进制值0x9E,我需要将其转换为0x61

我需要交换二进制1和0的位置,感觉应该很简单。

2个回答

29

只需使用 异或运算符^ 与 0xFF 进行运算:

>>> hex(0x9E ^ 0xFF)
'0x61'

如果您需要处理比一个字节更大的值,您可以从您的值上使用int.bit_length()方法创建掩码:
>>> value = 0x9E
>>> mask = (1 << value.bit_length()) - 1
>>> hex(value ^ mask)
'0x61'
>>> value = 0x9E9E
>>> mask = (1 << value.bit_length()) - 1
>>> hex(value ^ mask)
'0x6161'

好的,我有点困惑,为什么~x是错误的?毕竟它应该是二进制取反运算符。当涉及到二进制操作时,我无法理解有符号/无符号区别的缺失。 - Kos
2
@Kos:~ 字面上返回 -(x+1),在处理有符号值时非常好用。因此,~0x9E-159,或者是 -0x9f 的十六进制表示。但对于无符号位运算来说就不太适用了。 - Martijn Pieters
好的,我明白了。Python中“概念上无限长的1字符串在负数前面”的方法让我很困惑。用C位运算的比喻在这里行不通 :( - Kos
@aka.nice:没问题,那样可以(我不小心使用了|按位或运算符)。不过你仍需要创建掩码。 - Martijn Pieters

2

哈哈,刚刚发现Python的bin()函数返回一个字符串!

因此我们可以做一些有趣的事情!

for x in numbers: # numbers is a list of int
    b = bin(x)
    #print b # e.g. String 0b1011100101
    b = b.replace('0', 'x')
    b = b.replace('1', '0')
    b = b.replace('x', '1')
    b = b.replace('1b', '0b')
    #print b # String 0b0100011010
    print int(b, 2) # the decimal representation

这刚刚进入了我最实用代码清单的前五名 :) - Joe

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