在16位信号(Python)运算符上执行按位补码^

时间:2015-12-27 03:27:40

标签: python bit-manipulation

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

~ x

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

x ^ 65535

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

为什么这样做?

1 个答案:

答案 0 :(得分:4)

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

^表示按位XOR运算。单个位XOR b的真值表是:

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

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

那么x ^ 65535(或更清楚的x ^ 0xffff所做的是按位XOR,低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代表已被反转的位。

BTW:做同样事情的另一种方法是:

~x & 0xffff