Luke a Pro

Luke Sun

Developer & Marketer

🇺🇦
EN||

位元運算 (Bit Manipulation)

| , 2 minutes reading.

位元運算:總機接線員

演算法背後的故事:開關大師

想像一面巨大的牆,上面裝滿了數百萬個燈光開關。

  • 普通程式設計師看著這面牆說:「我想打開『訪客權限』那盞燈。」她們調用一個函數,該函數又調用另一個函數,最終撥動了一個開關。
  • 位元運算大師 看著這面牆,他發現整面牆其實就是一個數字。為了同時打開 100 盞燈,他不需要走到每個開關前;他只需要應用一個「掩碼 (Mask)」(一種模式),然後在一奈秒內同時撥動她們。

這就是 位元運算 (Bit Manipulation)。這是一門繞過數字和字串的抽象,直接與 位元 (Bit)(0 和 1)打交道的藝術。在 CPU 內部,其實並沒有「乘法」——只有位移和加法。透過使用這種語言,妳達到了硬體性能的理論極限。

為什麼需要它?

  • 標誌位元與權限: 與其使用 8 個布爾變量(佔用 8 個位元組),妳可以將 8 個權限儲存在單個位元組中,每個位元代表一個標誌(例如:讀、寫、執行)。
  • 壓縮: 緊湊地打包數據以節省頻寬(例如:用 16 位元而不是 32 位元儲存像素顏色)。
  • 性能: x >> 1 通常比 x // 2 快。x & 1x % 2 快。
  • 密碼學: 將數據與密鑰進行異或 (XOR) 運算是幾乎所有流加密演算法的基礎。

演算法是如何「思考」的

位元運算有 4 件核心工具:

  1. 與 (&): 「兩個開關都打開了嗎?」(用於檢查標誌位元)。
  2. 或 (|): 「打開其中任何一個開關。」(用於設置標誌位元)。
  3. 異或 (^): 「兩個開關的狀態不同嗎?」(用於切換狀態和基礎加密)。
  4. 位移 (<<, >>): 「將所有開關向左/向右滑動。」(用於快速乘以/除以 2 的冪)。

工程決策:XOR 的魔力

異或 (XOR) 是電腦科學中的「魔術」。她有一個獨特的屬性:A ^ B ^ B = A。 如果妳將一個數字與一個密鑰進行兩次異或運算,妳會得到原始數字。這就是為什麼她是加密系統和磁碟陣列 (RAID) 恢復系統的核心。

實作參考 (Python)

def bit_tricks():
    x = 10 # 二進位: 1010
    
    # 1. 檢查奇偶性 (最低位技巧)
    # 10 & 1 -> 1010 & 0001 -> 0000 (偶數)
    is_even = (x & 1) == 0
    
    # 2. 檢查是否為 2 的冪
    # 二進位中 2 的冪只有一個 '1' (例如 8 是 1000)
    # 8 & 7 -> 1000 & 0111 -> 0000
    def is_power_of_two(n):
        return n > 0 and (n & (n - 1)) == 0

    # 3. 不使用臨時變量交換兩個數 (XOR 技巧)
    a, b = 5, 9
    a = a ^ b
    b = a ^ b
    a = a ^ b
    # 現在 a=9, b=5

    # 4. 計算「1」的個數 (漢明重量)
    def count_ones(n):
        count = 0
        while n:
            n &= (n - 1) # 這行神妙的代碼會清除最低位的那一個 '1'
            count += 1
        return count

    return is_even, is_power_of_two(16), a, b, count_ones(7)

# 範例結果
print(bit_tricks()) # (True, True, 9, 5, 3)

小結

位元運算教會我們:效率存在於最底層。透過剝離高級類型的舒適感,我們獲得了對機器的完全控制。她提醒我們,無論軟體變得多麼複雜,其核心始終是數百萬個微小開關的美麗舞蹈。