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

标签 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

最佳答案

这就是 ~ 已经做的事情。棘手的部分是 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/

相关文章:

c - 使用按位运算符在 C 中返回最负的二进制补码数

python - 如何将元组变成元组的元组?

javascript - 将 id 从模板传递到 django 中的 View

python - 合并计算的文件内容并在输出中显示先前计算的数据

python - 如何使用 python 将带符号的整数打印为二进制补码的十六进制数?

objective-c - uint8_t 转二进制补码函数

python - 为 numpy 绑定(bind)列(来自向量)

performance - 将 XML 文档转换为二进制文件是什么意思?

python - 确定 MIDI 文件的时间划分

C++ gsoap mime/dime 用于 Windows 中的二进制文件