从十六进制到一';Python中的s补码

从十六进制到一';Python中的s补码,python,bit-manipulation,ones-complement,Python,Bit Manipulation,Ones Complement,有没有一种简单的方法可以在python中生成一个补码 例如,如果采用十六进制值0x9E,则需要将其转换为0x61 我需要把二进制1换成0,0换成1。感觉这应该很简单。只需针对0xFF使用: >>> hex(0x9E ^ 0xFF) '0x61' 如果需要处理大于一个字节的值,可以根据值上的创建掩码: >>> value = 0x9E >>> mask = (1 << value.bit_length()) - 1 >>

有没有一种简单的方法可以在python中生成一个补码

例如,如果采用十六进制值
0x9E
,则需要将其转换为
0x61

我需要把二进制1换成0,0换成1。感觉这应该很简单。

只需针对0xFF使用:

>>> hex(0x9E ^ 0xFF)
'0x61'
如果需要处理大于一个字节的值,可以根据值上的创建掩码:

>>> value = 0x9E
>>> mask = (1 << value.bit_length()) - 1
>>> hex(value ^ mask)
'0x61'
>>> value = 0x9E9E
>>> mask = (1 << value.bit_length()) - 1
>>> hex(value ^ mask)
'0x6161'
>>值=0x9E
>>>掩码=(1>>十六进制(值^mask)
“0x61”
>>>值=0x9E9E
>>>掩码=(1>>十六进制(值^mask)
“0x6161”

哈。刚刚发现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

好吧,我很困惑,为什么
~x
错了?它毕竟应该是二进制求反运算符。当二进制运算是concerned@Kos:
~
逐字返回
-(x+1)
,这在处理有符号值时非常好。所以
~0x9E
-159
,或者
-0x9f
十六进制。对于无符号位运算,不是很好。好的,我得到了这个,Python的“负数前面的
1
的概念上无限字符串”这种方法弄砸了我的脑袋。与C位运算的类比在这里不起作用:(@aka.nice:当然,这是有效的(我使用了
|
位或偶然)。不过,你仍然需要创建掩码。这只是让它进入了我最实用的代码列表的前五名:)