小問題,我試圖做一個16位長信號的按位補碼(NOT)。在Python從文檔,我天真地以爲做以下將工作:做一個16位信號(Python)運算符的按位補碼^
~ x
令我吃驚的這個返回負數。我在一個聊天中問道,他們告訴我使用:
x^65535
我仍然不明白的事情是爲什麼這個工作。
爲什麼這樣嗎?
小問題,我試圖做一個16位長信號的按位補碼(NOT)。在Python從文檔,我天真地以爲做以下將工作:做一個16位信號(Python)運算符的按位補碼^
~ x
令我吃驚的這個返回負數。我在一個聊天中問道,他們告訴我使用:
x^65535
我仍然不明白的事情是爲什麼這個工作。
爲什麼這樣嗎?
~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
謝謝,很好的答案。 –
簡短的回答:'〜x'反轉x'的'_all_位包括它的符號位。 'x^65536'(或'x^0xffff')僅反轉'x'的低16位。 – martineau
@martineau - 差不多! 0xffff是65535.'x^65536'只是將數字加上0x10000。 – tdelaney
@martineau謝謝,我將其納入我的答案。這就證明它可能更好地使用0xffff - 減少錯誤的機會;) – Anders