【发布时间】:2014-09-10 02:50:30
【问题描述】:
我需要在 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
【问题讨论】:
-
请问为什么?
bin表示可能会让您感到困惑。~确实反转了位;它只是反转了无限个位,因此无法以文本方式表示。bin因此对-进行了一些处理以使其工作,但最终隐藏了所有位都被反转的事实。 -
@Veedrac 我正在实现一个 16 位虚拟机。
-
我认为你的方法足够好,不要认为 python 有这样做的本机方式。一个小的变化可以是使用位移而不是幂。
-
如果是虚拟机,您可能知道寄存器宽度,因此您可以通过将表达式硬编码为
a ^ 0xFFFF来清理一下。 -
(1 << b.bit_length() - 1)将比(2 ** b.bit_length() - 1)更快 - 是的,如果可以的话,硬编码一个掩码而不是调用bit_length。
标签: python binary twos-complement