Python 提供了以下按位運算符,它們分別對二進制整數類型 int 值的每一位執行邏輯與、邏輯析取、互斥析取、按位反轉、左移和右移。
&
|
^
~
<<
>>
在本節中,我們首先解釋以下內容。
- 路口(AND) :
&
- 分離(OR) :
|
- 異或運算(XOR) :
^
接下來,我們將討論以下內容。
- 負整數的按位運算
- 位翻轉( NOT) :
~
- 位移:
<<
,>>
有關如何以二進制、八進制和十六進制寫入整數以及如何使用以下函數轉換二進制、八進制和十六進制數字和字符串的詳細信息,請參閱以下文章。
bin()
oct()
hex()
format()
另外,對於布爾值(真、假)的邏輯運算(布爾運算)而不是按位運算,請參考以下文章。使用 and,or 代替 &,|。
路口(AND) :&操作員
這是使用 & 的邏輯 AND 的示例。運算符,結果通過 bin() 轉換為二進製表示法的字符串。
x = 9 # 0b1001 y = 10 # 0b1010 print(x & y) print(bin(x & y)) # 8 # 0b1000
分離(OR) :|操作員
使用 | 的邏輯積 (OR) 的示例運算符,將結果通過 bin() 轉換為二進製表示的字符串並一起輸出。
print(x | y) print(bin(x | y)) # 11 # 0b1011
異或運算(XOR) :^操作員
使用 ^ 運算符的邏輯乘積 (XOR) 示例,結合使用 bin() 以二進製表示法轉換為字符串的結果。
print(x ^ y) print(bin(x ^ y)) # 3 # 0b11
邏輯AND、OR、XOR各位的輸入輸出關係如下表所示。
輸入 1 | 輸入 2 | 路口(AND) | 分離(OR) | 異或運算(XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
負整數的按位運算
當對負整數執行按位運算時,該值的處理就像它以二進制補碼形式表示一樣。
但是請注意,如果使用 bin() 或 format() 將負整數轉換為二進製字符串,則絕對值將帶有減號而不是二進制補碼格式。
如果你想得到一個用二進制補碼表示的字符串,用 AND 和所需的最大位數,如下所示。
- 對於 4 位
0b1111
(=0xf
) - 對於 8 位
0xff
- 對於 16 位
0xffff
您可以獲得一串二進制補碼表示(每個位都反轉並添加 1)。
x = -9 print(x) print(bin(x)) # -9 # -0b1001 print(bin(x & 0xff)) print(format(x & 0xffff, 'x')) # 0b11110111 # fff7
位翻轉:~操作員
~使用運算符進行位翻轉的示例。
按位反轉不僅僅是反轉每個位的值。使用該運算符時的返回值如下。~x
#ERROR!-(x+1)
-(x+1)
該值等效於將輸入值 x 視為二進制補碼形式並反轉所有位。
如上所述,在Python中,當使用bin()、format()等將負整數轉換為二進製字符串時,它不是二進制補碼形式,而是帶減號的絕對值。因此,將 ~x 直接轉換為字符串不會導致原始值位反轉的字符串。
x = 9 # 0b1001 print(~x) print(bin(~x)) # -10 # -0b1010
當我們進行AND運算,將其變成一串二進制補碼表示時,我們可以看到原值的位被反轉了。
另外,例如要得到一個4位位串按原樣反轉(省略符號位)的位串,使用format()將ANDed值的零填入如下04b'
print(bin(~x & 0xff)) print(format(~x & 0b1111, '04b')) # 0b11110110 # 0110
位移:<<,>>
使用位移運算符的左位移位和右位移位示例。
x = 9 # 0b1001 print(x << 1) print(bin(x << 1)) # 18 # 0b10010 print(x >> 1) print(bin(x >> 1)) # 4 # 0b100
對於負值,符號位被擴展和移位,正/負符號保持不變。負值是一直到左側的一行 1 的圖像。
x = -9 print(bin(x)) print(bin(x & 0xff)) # -0b1001 # 0b11110111 print(x << 1) print(bin(x << 1)) print(bin((x << 1) & 0xff)) # -18 # -0b10010 # 0b11101110 print(x >> 1) print(bin(x >> 1)) print(bin((x >> 1) & 0xff)) # -5 # -0b101 # 0b11111011
最好根據二進制補碼表達式的字符串進行思考,因為根據數字進行思考並不清楚。