Python中的"Bitwise Not"不考虑2的补码

lea*_*ira 5 python binary twos-complement

我需要在Python中执行"〜"操作,但不考虑2的补码.我设法通过使用XOR来做到这一点,你知道另一种方法吗?(更高效)

a = 0b101
b = 0b10101

print bin(a ^ (2 ** a.bit_length() - 1)) #0b10
print bin(b ^ (2 ** b.bit_length() - 1)) #0b1010
Run Code Online (Sandbox Code Playgroud)

Joh*_*ica 5

这就是~已经做的事情了。棘手的部分是 Python 具有无限长度的整数,因此当你反转一个数字时,它会被符号扩展(至少从概念上来说)是无限多个 1。这意味着你得到负数。

>>> bin(~0b101)
'-0b110'
>>> bin(~0b10101)
'-0b10110'
Run Code Online (Sandbox Code Playgroud)

要将这些转换为无符号数字,您需要决定您关心多少位。也许您正在使用 8 位字节。然后你可以将它们与一个字节的 1 位进行 AND 运算:

>>> bin(~0b101 & 0xFF)
'0b11111010'
>>> bin(~0b10101 & 0xFF)
'0b11101010'
Run Code Online (Sandbox Code Playgroud)

或者,如果您想匹配输入数字的精确位长度,您的解决方案是合理的。为了提高效率,您可以将指数切换为左移。~使用and&代替可能会更清楚^

>>> bin(~a & ((1 << a.bit_length()) - 1))
'0b10'
>>> bin(~b & ((1 << b.bit_length()) - 1))
'0b1010'
Run Code Online (Sandbox Code Playgroud)

(我怀疑像这样的硬编码掩码& 0xFFFF在实践中将是正确的解决方案。我想不出基于bit_length()- 的答案的良好现实世界用例。)