2015-12-27 133 views
0

小問題,我試圖做一個16位長信號的按位補碼(NOT)。在Python從文檔,我天真地以爲做以下將工作:做一個16位信號(Python)運算符的按位補碼^

~ x 

令我吃驚的這個返回負數。我在一個聊天中問道,他們告訴我使用:

x^65535 

我仍然不明白的事情是爲什麼這個工作。

爲什麼這樣嗎?

+3

簡短的回答:'〜x'反轉x'的'_all_位包括它的符號位。 'x^65536'(或'x^0xffff')僅反轉'x'的低16位。 – martineau

+1

@martineau - 差不多! 0xffff是65535.'x^65536'只是將數字加上0x10000。 – tdelaney

+1

@martineau謝謝,我將其納入我的答案。這就證明它可能更好地使用0xffff - 減少錯誤的機會;) – Anders

回答

4

~x反轉x的所有位,包括其符號位。 x^65535只反轉x的低16位。

^表示按位異或運算。真值表單位一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哪個更清晰)所做的是將低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 
+0

謝謝,很好的答案。 –