我需要在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'
或者,如果您想匹配输入数字的精确位长度,您的解决方案是合理的。为了提高效率,您可以将指数切换为左移。使用它可能会更清楚~
and &
代替^
.
>>> bin(~a & ((1 << a.bit_length()) - 1))
'0b10'
>>> bin(~b & ((1 << b.bit_length()) - 1))
'0b1010'
(我怀疑像这样的硬编码掩码& 0xFFFF
将是实践中正确的解决方案。我想不出一个好的现实世界用例bit_length()
基于答案。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)