在Python中有没有简单的方法来产生补码?
例如,如果您取十六进制值0x9E
,我需要将其转换为0x61
。
我需要交换二进制1和0的位置,感觉应该很简单。
在Python中有没有简单的方法来产生补码?
例如,如果您取十六进制值0x9E
,我需要将其转换为0x61
。
我需要交换二进制1和0的位置,感觉应该很简单。
只需使用 异或运算符^
与 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'
哈哈,刚刚发现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
是错误的?毕竟它应该是二进制取反运算符。当涉及到二进制操作时,我无法理解有符号/无符号区别的缺失。 - Kos~
字面上返回-(x+1)
,在处理有符号值时非常好用。因此,~0x9E
是-159
,或者是-0x9f
的十六进制表示。但对于无符号位运算来说就不太适用了。 - Martijn Pieters1
字符串在负数前面”的方法让我很困惑。用C位运算的比喻在这里行不通 :( - Kos|
按位或运算符)。不过你仍需要创建掩码。 - Martijn Pieters