位運算模擬器(AND、OR、XOR、NOT、移位)

對兩個數值計算 AND、OR、XOR、NOT、左移、右移,並通過二進位制網格直觀展示每一位的變化。支援 8/16/32 位寬。

使用提示

  • 數值不僅可以輸入十進位制,還可以使用 `0x1A` 形式的十六進位制或 `0b1010` 形式的二進位制字首,直接照抄程式碼中的寫法即可。
  • AND、OR、XOR 需要兩個數值,NOT 只需要一個數值。切換運算型別時,輸入框數量會自動調整。
  • 右移(`>>>`)本工具只支援邏輯移位。它與保留符號位的算術移位有何不同,請參見下方常見問題。
  • 將位寬從 8 位切換到 16 位、32 位,可以直觀看到同一個數值的高位會補上更多的 0,有助於理解“位寬”的真正含義。
  • 黃色高亮的位表示演算前後發生變化的位。使用 AND、OR 時,可以直觀追蹤哪個輸入值在每一位上“勝出”。

常見問題

有區別。邏輯移位(`>>>`)始終用 0 填充空出的高位,而算術移位(`>>`)則會複製符號位(最高位)來填充。由於本工具將數值視為指定位寬內的非負整數,符號並非核心概念,因此只提供更易理解的邏輯移位。

JavaScript 的位運算子內部按 32 位有符號整數計算,例如對 8 位的 `00000001`(1)取反,通常會得到 `-2` 這樣的負數。本工具會按你選擇的位寬(8/16/32)重新掩碼結果,因此在 8 位下會正確顯示為 `11111110`(254),即該位寬下的正確表示。

AND 只有當兩個位都為 1 時結果才為 1,常用於提取特定位的掩碼操作。OR 只要有一個位為 1 結果就為 1,常用於置位(把某些位設為 1)。XOR 只有兩個位不同時結果才為 1,常用於翻轉某些位或交換兩個數值。

左移(`<<`)是快速實現乘以 2 的冪(如乘 2、乘 4)的方法,右移(本工具為邏輯移位)常用於除以 2 或從數值中提取特定範圍的位。這兩者在競賽程式設計和基於位掩碼的演算法中也非常常見。

嚴格來說並不完全相同。位運算指的是 AND、OR、XOR、NOT、移位這些運算本身,而位掩碼是配合這些運算(尤其是 AND、OR)使用的一個數值,用來“只提取或改寫特定的位”。例如 `value & 0b00001111` 就是提取最低 4 位的典型位掩碼用法。
ツールくん

閒話 ― XOR 的奇妙特性與實際應用

位運算直接對應計算機內部的邏輯電路,是 CPU 能夠執行得最快的運算之一,通常只需一個時鐘週期。由於所需電路遠比乘法、除法簡單,效能敏感的場景(影像處理、加密演算法、網路協議實現等)長期以來都會用位運算技巧來替代開銷更大的算術運算。

XOR(異或)有一些有趣的性質:一個值與自身異或結果恆為 0(`a ^ a = 0`),與 0 異或則結果保持原值不變(`a ^ 0 = a`)。利用這兩條性質,可以在不使用臨時變數的情況下交換兩個變數的值,這就是經典的“異或交換法”(`a ^= b; b ^= a; a ^= b;`)。出於可讀性考慮,現代實際專案中已不太推薦使用,但它至今仍是理解位運算特性的經典教學示例。

位掩碼在實際系統中應用廣泛。Unix 檔案許可權(讀=4、寫=2、執行=1)本質上就是位運算的 OR 與 AND;從顏色程式碼 `#FF0000` 中提取紅、綠、藍各分量,也是通過右移配合 AND 掩碼實現的。將多個開關狀態壓縮排一個整數中管理的“位標誌”技巧,也曾在記憶體有限的舊遊戲和系統程式設計中被廣泛使用。