2024年11月4日 星期一

位元運算(Bitwise Operations)

 位元運算(Bitwise Operations)用於對數字的二進位表示進行操作。這些操作通常用於底層計算、性能優化和特殊用途,比如在圖像處理、網路編碼、數據壓縮等應用中。以下是 Python 中常用的位元運算符號及其用途:

1. 位元運算符

運算符名稱用法說明
&位元 ANDa & b對應位元都為 1 才為 1
|位元 ORa | b只要有一個位元為 1 就為 1
^位元 XORa ^ 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)

沒有留言:

張貼留言