2017-10-04 57 views
0

爲什麼按位不是不按預期切換位?見下面的例子:Bit-wise NOT在Python中的含義

a = 5 
print(bin(a)) 
b = ~a 
print(bin(b)) 

這是輸出:

0b101 
-0b110 

的問題是,爲什麼從左邊第一位不反轉?

考慮到Python文檔說:

〜X返回x的補充 - 您可以通過切換各 1 0獲得數量和每個0爲1


編輯:你是說「〜」不是簡單切換位的操作符,而是兩個補碼的操作符? 如果是這樣,爲什麼從文檔中引用的句子沒有說明。 Pyhton文檔中的上述句子並不意味着這對我來說。

+0

這兩個互補 –

+0

注意'-'在-0b110'的'前。它無法向您展示一系列無窮大的'1's,它們向左延伸,因此它向您顯示'bin(abs(b))',前面帶有'-'符號。 – user2357112

+0

序言 - https://wiki.python.org/moin/BitwiseOperators –

回答

4

切換所有的位。 他們的所有,包括前導零的無限數量,產生領頭的人的無限數量:

0b...111111111111111111111111111111111111111111111111111010 

因爲Python模擬無限位表示,而不是3位或32位或64位或任何有限數量。

Python無法向您顯示無限數量的前導字符,因此它會向您顯示bin(abs(b))前面帶有-的符號。 abs(b)6bin(6)'0b110',讓你看到

-0b110 
+0

這是一個非常好的答案。你從哪裏得到信息? – lmiguelvargasf

+0

@lmiguelvargasf:很難記住我讀過的所有東西,但至少我的一個來源可能是[Python數據模型文檔](https://docs.python.org/3/reference/datamodel.html #標準類型層次結構),其中說:「爲了移位和掩碼操作的目的,假定一個二進制表示,並且負數用2的補碼變體表示,這給出了無限串符號位的錯覺延伸到左邊。「 – user2357112