gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 01:14:59 24 4
gpt4 key购买 nike

我需要在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com