位元運算(Bitwise Operations)用於對數字的二進位表示進行操作。這些操作通常用於底層計算、性能優化和特殊用途,比如在圖像處理、網路編碼、數據壓縮等應用中。以下是 Python 中常用的位元運算符號及其用途:
1. 位元運算符
運算符 | 名稱 | 用法 | 說明 |
---|---|---|---|
& | 位元 AND | a & b | 對應位元都為 1 才為 1 |
| | 位元 OR | a | b | 只要有一個位元為 1 就為 1 |
^ | 位元 XOR | a ^ b | 對應位元不同才為 1 |
~ | 位元 NOT | ~a | 位元取反,0 變成 1,1 變成 0 |
<< | 左移位 | a << n | 將位元往左移 n 位(相當於乘以 2^n) |
>> | 右移位 | a >> n | 將位元往右移 n 位(相當於整除 2^n) |
2. 位元運算的基本概念
假設我們有兩個整數:
a = 5 # 二進位為 0101
b = 3 # 二進位為 0011
位元 AND:&
a & b
會比較每一對應的位元,只有當兩者都是 1 時結果才是 1,否則為 0。
a & b = 0101 & 0011 = 0001 # 結果為 1
位元 OR:|
a | b
會比較每一對應的位元,只要其中一個位元為 1,結果就是 1。
a | b = 0101 | 0011 = 0111 # 結果為 7
位元 XOR:^
a ^ b
會比較每一對應的位元,若位元不同結果為 1,相同則為 0。
a ^ b = 0101 ^ 0011 = 0110 # 結果為 6
位元 NOT:~
~a
會將a
的位元取反:所有的 0 變成 1,1 變成 0。- 需要注意的是,Python 使用二補數表示法,
~a
會等於-(a+1)
。
~a = ~0101 = 1010 # 結果為 -6(在 Python 中 ~5 等於 -6)
左移位:<<
a << n
將a
的位元往左移n
位,相當於a * (2**n)
。
a << 1 = 0101 << 1 = 1010 # 結果為 10,相當於 5 * 2 = 10
a << 2 = 0101 << 2 = 10100 # 結果為 20,相當於 5 * 4 = 20
右移位:>>
a >> n
將a
的位元往右移n
位,相當於a // (2**n)
。
a >> 1 = 0101 >> 1 = 0010 # 結果為 2,相當於 5 // 2 = 2
a >> 2 = 0101 >> 2 = 0001 # 結果為 1,相當於 5 // 4 = 1
3. 常見的位元運算應用
(1) 檢查數字是否為奇數或偶數
- 使用
&
運算符可以快速檢查數字是否為奇數或偶數。
n = 7
if n & 1:
print("奇數")
else:
print("偶數")
(2) 交換變數值(不使用額外變數)
- 使用 XOR 可以交換兩個變數的值,而不需要額外的變數。
a = 5
b = 3
a = a ^ b # a = 6
b = a ^ b # b = 5
a = a ^ b # a = 3
print(a, b) # 結果為 a = 3, b = 5
(3) 計算 2 的冪次
- 使用左移位
<<
可以快速計算 2 的冪次。
print(1 << 3) # 2^3 = 8
print(1 << 4) # 2^4 = 16
(4) 快速乘以或除以 2 的冪
- 左移
<<
相當於乘以 2 的 n 次方;右移>>
相當於除以 2 的 n 次方。
x = 5
print(x << 1) # 10,相當於 5 * 2
print(x >> 1) # 2,相當於 5 // 2
(5) 設定、清除和切換位元
- 設定位元:將某一位設為 1,例如將第
k
位設為 1:x = x | (1 << k)
- 清除位元:將某一位設為 0,例如將第
k
位清除:x = x & ~(1 << k)
- 切換位元:將某一位取反,例如將第
k
位取反:x = x ^ (1 << k)
沒有留言:
張貼留言