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

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

什麼是位元運算

位元運算會把數值視為二進位(由 0 與 1 組成)的位元序列,然後逐位進行邏輯運算。AND(與)、OR(或)、XOR(互斥或)、NOT(取反)、移位(左移/右移)是最具代表性的五種運算,全部都是 CPU 能直接執行的基礎指令,速度遠比加減乘除等算術運算快得多。在程式語言中通常寫作 `&`、`|`、`^`、`~`、`<<`、`>>`,廣泛應用於旗標管理、權限控制、加密演算法、影像處理等場景。

本工具可以指定數值 A、數值 B(NOT 只使用數值 A)以及位寬(8/16/32 位),並以網格的形式將運算結果逐位視覺化呈現。數值可以用十進位輸入,也可以加上 `0x`(十六進位)或 `0b`(二進位)字首,寫法與程式碼中的表示方式一致。超出所選位寬範圍的數值無法被正確表示,因此先決定好位寬,有助於正確理解運算結果。

位元運算模擬器的使用方法

  1. 選擇位寬 從 8/16/32 位中選擇要模擬的位寬。若不確定該選哪一種,建議先從 8 位開始,位元數較少,變化也更容易一眼看懂。
  2. 選擇運算型別 從 AND、OR、XOR、NOT、左移、右移中選擇要執行的運算。選擇 NOT 時,輸入框會自動切換為只需一個數值。
  3. 輸入數值 在數值 A(AND/OR/XOR/移位時也需要數值 B)欄位中,以十進位、`0x` 十六進位或 `0b` 二進位的形式輸入數字;若選擇移位運算,還需另外指定移位位數。
  4. 查看結果網格 輸入完成後,結果會自動計算並以逐位網格顯示。黃色高亮的位元代表相對於數值 A 發生了變化,可用來追蹤每一位的運算過程。
  5. 對照十進位與十六進位表示 結果列下方會同時顯示十進位與十六進位的表示法,方便與程式碼中實際使用的數值格式進行比對。

用好本工具的小技巧

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

位元運算的實際應用場景

程式設計學習中驗證位元運算子

在學習 C、Java、Python 等語言時,AND、OR、XOR、NOT、移位這些運算子的結果往往難以心算,尤其是 NOT 與移位。透過視覺化的網格逐位確認,可以更快建立正確的直覺。

設計位元旗標與權限系統

Unix 檔案權限、將多個開關狀態壓縮進一個整數管理的“位元旗標”手法,都是位元運算的實際應用。可以先在本工具中試算 AND 遮罩提取、OR 設定旗標等操作,確認邏輯無誤後再寫進程式。

競賽程式設計與位元遮罩演算法驗證

位元遮罩 DP、集合的位元表示等競賽程式設計常見手法,往往需要先用較小的數值手動驗證邏輯是否正確。本工具可以快速確認每一步運算的中間結果。

搭配進位制轉換確認十六進位與二進位

在確認運算結果的同時,也能一併查看數值對應的十進位、十六進位、二進位表示,適合與進位制轉換工具搭配使用,理解不同進位表示法之間的關係。

色彩碼與網路位址/子網路遮罩計算

從 `#FF0000` 這類色彩碼中提取紅、綠、藍分量,或計算 IP 位址與子網路遮罩的 AND 結果,都是位元運算在日常開發中常見的實際用途。

位元運算相關用語集

AND(與)
只有當兩個位元都為 1 時,結果才為 1,其餘情況皆為 0。常用於遮罩操作,提取數值中特定的位元。
OR(或)
只要有任一位元為 1,結果就為 1。常用於置位操作,將指定的位元設為 1。
XOR(互斥或)
只有當兩個位元不同時,結果才為 1;相同則為 0。常用於翻轉特定位元、交換數值,或偵測兩個數值之間的差異。
NOT(取反)
將單一數值的所有位元反轉(0 變 1、1 變 0)。結果的具體表示會因所選位寬而異。
移位運算
將整個位元排列向左或向右平移。左移相當於乘以 2 的冪次,右移(本工具採用邏輯移位)相當於除以 2 並捨去餘數。
位元遮罩
與 AND、OR 等運算搭配使用、用來提取或修改特定位元的數值。例如 `0b00001111` 可用來提取數值最低的 4 個位元。
位寬
表示一個數值所使用的位元數量。8 位可表示 0~255,16 位可表示 0~65535,超出範圍的數值無法在該位寬下正確表示。
二進位與十六進位表示法
二進位只使用 0 與 1 表示數值,十六進位則使用 0~9 與 A~F。由於每 4 個二進位位元恰好對應 1 位十六進位數字,十六進位常被當作二進位的簡潔書寫方式。

常見問題

有區別。邏輯移位(`>>>`)始終用 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 掩碼實現的。將多個開關狀態壓縮排一個整數中管理的“位標誌”技巧,也曾在記憶體有限的舊遊戲和系統程式設計中被廣泛使用。