ビットシフトとは?
ビットシフトとは、整数を2進数で表したときの各桁(ビット)を、指定した桁数だけ左または右にずらす操作のことです。プログラミングをはじめ、低レベルの最適化、グラフィックス処理、ハッシュ計算、組み込みシステムなど、さまざまな場面で使われる基本的な演算です。左シフト(n << k)は、ビットを最上位側へずらし、空いた下位ビットを0で埋めます。一方の右シフト(n >> k)は、ビットを最下位側へずらします。
この計算機の使い方
整数 n と、ずらすビット数 k を入力し、シフトの向き(左・右)を選ぶだけです。計算結果は10進数で表示されます。この計算機は64ビット符号付き整数で演算を行うため、多くのプログラミング言語と同じ挙動になります。
計算式のしくみ
左に1桁シフトすると値は2倍になります。つまり、左に k 桁シフトすると \(2^{k}\) 倍になるわけです:
$$\text{Result} = \text{Number (n)} \ll \text{Shift (k)} = n \times 2^{k}$$逆に右に1桁シフトすると、小数点以下を切り捨てて値が半分になります。したがって右に k 桁シフトすると、\(2^{k}\) での整数除算と同じ結果になります:
$$\text{Result} = \text{Number (n)} \gg \text{Shift (k)} = \left\lfloor \frac{n}{2^{k}} \right\rfloor$$ハードウェア上ではシフト演算が乗算や除算よりはるかに高速なのは、このためです。
具体例で見てみよう
n = 16 を左に k = 2 桁シフトしてみましょう。16 は2進数で 10000 です。左に2桁シフトすると末尾に0が2つ加わり 1000000 となり、これは64になります。計算で確かめると、
逆向きに \(64 \gg 2 = \left\lfloor 64 / 4 \right\rfloor = 16\) とすれば、元の値に戻ります。
2 の累乗 参照表
左シフト \(k\) ビットは数値に \(2^k\) を掛けます。右シフト \(k\) ビットは \(2^k\) で割ります(整数の場合、余りは破棄されます)。このテーブルを使用して、指定されたシフト量に対する乗数または除数をすぐに読み取ります。
| シフト \(k\) | \(2^k\)(10進数) | \(\ll k\) / \(\gg k\) の意味 |
|---|---|---|
| 0 | 1 | 変更なし |
| 1 | 2 | \(\times 2\) / \(\div 2\) |
| 2 | 4 | \(\times 4\) / \(\div 4\) |
| 3 | 8 | \(\times 8\) / \(\div 8\) |
| 4 | 16 | \(\times 16\) |
| 5 | 32 | \(\times 32\) |
| 6 | 64 | \(\times 64\) |
| 7 | 128 | \(\times 128\) |
| 8 | 256 | \(\times 256\)(1バイト) |
| 9 | 512 | \(\times 512\) |
| 10 | 1,024 | \(\times 1024\)(1 KiB) |
| 11 | 2,048 | \(\times 2048\) |
| 12 | 4,096 | \(\times 4096\) |
| 13 | 8,192 | \(\times 8192\) |
| 14 | 16,384 | \(\times 16384\) |
| 15 | 32,768 | \(\times 32768\) |
| 16 | 65,536 | \(\times 65536\)(2バイト) |
| 17 | 131,072 | |
| 18 | 262,144 | |
| 19 | 524,288 | |
| 20 | 1,048,576 | \(\times\) 1 MiB |
| 32 | 4,294,967,296 | 32ビット境界 |
| 63 | 9,223,372,036,854,775,808 | 64ビット符号付き整数の最上位ビット |
よくある質問(FAQ)
左シフトでデータが失われることはありますか? あります。整数のビット幅を超えてはみ出したビットは捨てられます(オーバーフロー)。ただし64ビットの範囲内であれば、この計算機は値を保持します。
負の数を右シフトするとどうなりますか? この計算機は算術(符号付き)右シフトを採用しているため、符号ビットが保たれ、負の数は負のままになります。
なぜ乗算や除算ではなくシフトを使うのですか? ビットシフトは多くのCPUで1サイクルで処理できる演算です。そのため、2のべき乗での掛け算や割り算を高速に行う手段として重宝されます。