小问题,我试图对16位长的信号进行按位补码(NOT)。在文档中的Python中,我天真地认为执行以下操作会起作用:
~ x
令我惊讶的是,这会返回负数。我在聊天时询问他们告诉我使用:
x ^ 65535
我仍然不明白的是为什么这样做。
为什么这样做?
答案 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