位移計算器
對整數執行左移、邏輯右移與算術右移,並以二進位、十進位和十六進位顯示結果。
輸入數字,選擇移位類型與位數,即可立即查看三種數制下的移位結果。
位移計算器
對整數執行左移、邏輯右移與算術右移,並以二進位、十進位和十六進位顯示結果。
將各位向左移動 n 位。等同於把數字乘以 2ⁿ。右側空出的位會補 0。
關於位移
位移是電腦程式設計與數位硬體設計中最基礎的運算之一。位移會把二進位數中的所有位元向左或向右移動指定的位數,並丟棄從一端移出的位元,同時依照位移類型在另一端補入對應的位元。
左移運算子(<<)會將所有位元向左移動 n 位。移出左側的 n 位會被丟棄,右側補上 n 個 0。左移 n 位在數學上等同於把整數乘以 2ⁿ,只要不會溢位即可。例如,5(二進位 101)左移 2 位得到 20(二進位 10100),因為 5 × 4 = 20。編譯器常會以左移取代 2 的冪次乘法,因為它通常只需一個 CPU 時脈週期就能完成。
邏輯右移(>>>)會將所有位元向右移動 n 位。移出右側的 n 位會被丟棄,左側補上 n 個 0。這會把數字視為無符號數,並等同於除以 2ⁿ 後向下取整。例如,40(二進位 101000)邏輯右移 3 位得到 5(二進位 000101)。在 Java 等語言中,無符號整數的標準操作就是邏輯右移,因此會明確使用 >>>。
算術右移(>>)同樣會將位元向右移動 n 位,但它不會在左側補 0,而是複製符號位——最高位。對於正數(符號位為 0),它會補 0,行為與邏輯右移相同。對於負數(在二進位補數中符號位為 1),它會補 1,從而保留負號。例如,−16(32 位元補數:...11110000)算術右移 2 位得到 −4(二進位 ...11111100)。這會維持數字的符號,並等同於有符號整數除以 2ⁿ 後向負無窮大取整。
位移在效能敏感的程式中被廣泛使用。雜湊函式、密碼學演算法、影像處理、音訊編碼和網路協定解析都依賴位移來提升效率。在硬體中,移位暫存器是基礎電路,是序列通訊協定、CRC 產生器,以及用於亂數產生和資料擾碼的線性回饋移位暫存器(LFSR)的基礎。
位移範例
常見的移位操作,展示移位與乘除以 2 的冪之間的關係。
| 操作 | 二進位結果 | 十進位檢查 |
|---|---|---|
| 5 << 2(左移 2 位) | 10100 | 5 × 4 = 20 ✓。左移 2 位等同於乘以 2² = 4。 |
| 40 >>> 3(邏輯右移 3 位) | 101 | 40 ÷ 8 = 5 ✓。邏輯右移 3 位等同於無符號除以 2³ = 8。 |
| −16 >> 2(算術右移 2 位) | 11111100(−4) | −16 ÷ 4 = −4 ✓。算術移位會保留符號位,因此結果仍為負數。 |
| 二進位 1010 << 1(左移 1 位) | 10100 | 二進位 1010(十進位 10)變成 10100(十進位 20)。左移 1 位會讓數值加倍。 |
如何使用位移計算器
- 選擇輸入格式:選「十進位」可輸入十進位整數(允許負數),選「二進位」可輸入二進位字串。
- 在輸入欄位中輸入數字。若選擇二進位輸入,請只使用 0 和 1。
- 選擇移位類型:「左移(<<)」表示乘以 2 的冪,「邏輯右移(>>>)」用於無符號除法,「算術右移(>>)」用於有符號除法。
- 輸入移位位數——也就是要移動的位元數(0 到 31)。
- 點擊「計算位移」。結果會以二進位、十進位和十六進位顯示。
位移計算器常見問題
邏輯右移和算術右移有什麼差別?
邏輯右移會始終在左側補 0,因此會把運算元視為無符號數。算術右移會在左側補上符號位的複本——正數補 0,負數在二進位補數中補 1。對非負數來說,這兩種操作的結果相同;只有在運算元為負數時才會不同。在 C/C++ 中,帶符號型別上的 >> 運算子在大多數架構上執行的是算術右移。
為什麼左移等於乘以 2 的冪?
在二進位中,每個位元都代表 2 的冪。把所有位元向左移動一位,就會讓每一位的權重翻倍,因此整個數值也翻倍。左移 n 位就是乘以 2ⁿ。例如,6(二進位 110)左移 3 位得到 110000₂ = 48,而 6 × 8 = 48。編譯器會利用這一點,用更便宜的移位指令取代代價更高的乘法指令,只要乘數是 2 的冪次常數。
位移移出邊界的位元會怎樣?
超出暫存器寬度的位元會被直接丟棄。對於左移,超出暫存器寬度的高位會被丟掉,因此如果結果大到無法放入目標型別,可能會出現意外結果。對於右移,越過 0 位的低位會被丟棄,這等同於向零截斷(邏輯右移)或向負無窮大取整(算術右移)。
可以用位移做除法嗎?
可以。邏輯右移 n 位會把無符號整數除以 2ⁿ(並截斷小數部分)。算術右移 n 位會把有符號整數除以 2ⁿ,並向負無窮大取整。這和 C 語言對負數的整數除法並不相同:−7 >> 1 = −4(算術右移),但 −7 / 2 = −3(C 會向零截斷)。請根據需要選擇向下取整或截斷。
最大移位位數是多少?
對於 32 位元整數,位移 32 位元或更多在 C/C++ 中屬於未定義行為,而在硬體中通常會按 32 取模處理(移位 n 位等同於移位 n mod 32 位)。本計算器支援 0 到 31 位元的移位,涵蓋完整的 32 位元範圍。若要處理更大的移位,就需要使用多字運算或 64 位元整數型別。
位移在真實程式中如何使用?
位移廣泛用於各種情境。整數中的位元欄位打包與拆包(網路封包標頭、像素色彩通道)、以 2 的冪進行快速乘除、計算雜湊值、實作 AES 和 SHA 等密碼學原語、從更大的字中擷取半位元組和位元組,以及計算位元遮罩,都是常見用途。只要程式需要隔離或設定特定位元,位移和位元 AND/OR 就是首選工具。