我需要在 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
最佳答案
这就是 ~
已经做的事情。棘手的部分是 Python 有无限长度的整数,所以当你反转一个数字时,它会被符号扩展——至少从概念上讲——无限数量的 1。这意味着你得到负数。
>>> bin(~0b101)
'-0b110'
>>> bin(~0b10101)
'-0b10110'
要将这些转换为无符号数,您需要确定您关心的位数。也许您正在使用 8 位字节。然后你可以用一个字节的 1 位对它们进行 AND:
>>> bin(~0b101 & 0xFF)
'0b11111010'
>>> bin(~0b10101 & 0xFF)
'0b11101010'
或者如果你想匹配输入数字的精确位长,你的解决方案是合理的。为了提高效率,您可以将指数切换为左移。使用 ~
和 &
代替 ^
可能会更清楚。
>>> bin(~a & ((1 << a.bit_length()) - 1))
'0b10'
>>> bin(~b & ((1 << b.bit_length()) - 1))
'0b1010'
(我怀疑像 & 0xFFFF
这样的硬编码掩码在实践中将是正确的解决方案。我想不出 bit_length()
的一个好的现实世界用例> 基于答案。)
关于python - Python 中的 "Bitwise Not"不考虑 2 的补码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25756577/