資料表示法與數字系統

位元運算(bitwise operation)

位元運算不是把一個數當成單一數量,而是把它當成一排各自獨立的位元,對每一個位元位置分別套用一條簡單的邏輯規則。想像兩排電燈開關對齊排好;位元運算把開關 1 比開關 1、開關 2 比開關 2、依此類推,各自決定每一個輸出開關。這跟普通算術不同,算術裡某一欄的進位會漣漪到下一欄——在這裡每一欄完全獨立。

有四個日常運算。AND(且)只在兩個輸入都是 1 時給出 1,所以用來「遮罩」——保留某些位元、把其他強制為 0。OR(或)在任一輸入是 1 時給出 1,所以用來把位元設為 1。XOR(互斥或)只在兩個輸入不同時給出 1,這使它非常適合切換位元與找出差異。NOT(非)翻轉每個位元(取補)。例如 a = 0b1100、b = 0b1010 時:a AND b = 0b1000,a OR b = 0b1110,a XOR b = 0b0110。這些直接對應到晶片由之建構的邏輯閘,所以極快。

位元運算是把若干個是非旗標打包進一個整數、再讀取或更改它們的日常工具:用一個遮罩做 AND 來測試旗標、用 OR 來設定它、用 XOR 來翻轉它、用反轉遮罩做 AND 來清除它。要避開一個常見混淆:位元 AND(在 C 系語言寫成 &)和邏輯 AND(寫成 &&)不一樣。位元 AND 逐位元結合兩個數、產生一個數;邏輯 AND 結合兩個真/假條件、產生單一的真或假。把兩者搞混是經典的新手 bug。

當 a = 0b1100(12)、b = 0b1010(10):a AND b = 0b1000(8),a OR b = 0b1110(14),a XOR b = 0b0110(6),NOT a(在 4 位元內)= 0b0011(3)。要清除任何值 x 的最低位,計算 x AND 0b…1110。

AND 遮罩、OR 設定、XOR 切換、NOT 翻轉——各自對位元位置獨立作用。

別把位元 AND(&)和邏輯 AND(&&)搞混:前者逐位元結合兩個數,後者結合兩個真/假條件。把兩者調換是惡名昭彰的新手 bug。

又称
bit operationsAND OR XOR NOT逐位元運算