对 16 位信号 (Python) 运算符进行按位补码 ^

Doing bitwise complement on a 16-bit signal (Python) operator ^

小问题,我正在尝试对 16 位长的信号进行按位补码 (NOT)。在文档的 Python 中,我天真地认为执行以下操作会起作用:

~ x

令我惊讶的是这个 returns 负数。我在聊天中询问,他们告诉我使用:

x ^ 65535

我仍然不明白为什么会这样。

为什么这样做有效?

~x 反转 x 的所有位,包括其符号位。 x ^ 65535 仅反转 x 的低 16 位。

^表示按位异或运算。单个位 a XOR b 的真相 table 是:

a b | a^b
---------
0 0 | 0
0 1 | 1    <-
1 0 | 1
1 1 | 0    <-

XOR 有一个有趣的 属性 即 a ^ 0 = a(恒等式)和 a ^ 1 = not a(反转)。您可以在上面 table.

<- 行中看到这一点

那么x ^ 65535(或更清楚的x ^ 0xffff)所做的是将低16位与16位按位异或以仅反转低16位(0xffff == 65535是16位) .所以对于一个 32 位的例子:

       xxxx xxxx xxxx xxxx aaaa aaaa aaaa aaaa
xor    0000 0000 0000 0000 1111 1111 1111 1111
----------------------------------------------
       xxxx xxxx xxxx xxxx AAAA AAAA AAAA AAAA (where A is ~a)

x 表示在输入和结果中保持相同的位。 A 表示已反转的位。

顺便说一句:做同样事情的另一种方法是:

~x & 0xffff