Python 按位運算符(邏輯積、邏輯或、異或、反轉、移位)

商業

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)
11110
10011
01011
00000

負整數的按位運算

當對負整數執行按位運算時,該值的處理就像它以二進制補碼形式表示一樣。

但是請注意,如果使用 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

最好根據二進制補碼表達式的字符串進行思考,因為根據數字進行思考並不清楚。

Copied title and URL