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

Dav*_*ozo 0 python bit-manipulation

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

~ x
Run Code Online (Sandbox Code Playgroud)

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

x ^ 65535
Run Code Online (Sandbox Code Playgroud)

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

为什么这有效?

And*_*ers 6

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

意思^是按位异或运算。一位 a 异或 b 的真值表为:

a b | a^b
---------
0 0 | 0
0 1 | 1    <-
1 0 | 1
1 1 | 0    <-
Run Code Online (Sandbox Code Playgroud)

XOR 有一个有趣的属性,即a ^ 0 = a(同一性)和a ^ 1 = not a(反转)。<-您可以在上表中的行中看到这一点。

所以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)
Run Code Online (Sandbox Code Playgroud)

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

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

~x & 0xffff
Run Code Online (Sandbox Code Playgroud)