左シフトで2倍にする
左シフト(<<)でN位置シフトすると2^N倍になる仕組みを学びます。オーバーフロー動作やシフトが乗算より優れる場合を理解します。
Shift Operations
詳細な説明
左シフト(<<)による乗算
バイナリ数値を1位置左にシフトすることは2倍にすることと同等です。N位置左にシフトすると2^N倍になります。
仕組み
5 = 00000101
5 << 1 = 00001010 (10、つまり5 * 2)
5 << 2 = 00010100 (20、つまり5 * 4)
5 << 3 = 00101000 (40、つまり5 * 8)
各シフトで右に0が挿入され、すべてのビットが1位置左に移動します。数学的な結果はシフト位置ごとに2倍です。
一般式
A << N = A * (2^N)
オーバーフローとビット幅
シフトした値がビット幅を超えると、上位ビットが失われます。8ビットの場合:
200 = 11001000
200 << 1 = 10010000 (144、400ではない!)
これは(A * 2^N) mod 2^widthと同等です。シフトベースの乗算を使用する前に値がオーバーフローしないか常に確認してください。
パフォーマンス
ほとんどのCPUでは、シフト命令はシフト量に関係なく1クロックサイクルで実行されますが、乗算は3-5サイクルかかる場合があります。最新のコンパイラは2の累乗による乗算を自動的にシフトに変換しますが、インタプリタ言語やホットループでは明示的なシフトで測定可能なパフォーマンス向上が得られます。
2の累乗の作成
1 << Nは2^Nを生成します。これはビットマスク作成の標準イディオムです:
const bit0 = 1 << 0; // 1
const bit7 = 1 << 7; // 128
const bit31 = 1 << 31; // -2147483648(符号付き32ビット)
ユースケース
組み込みシステム開発者はタイムクリティカルな割り込みサービスルーチンで高速乗算のために左シフトを使用します。例えば、ADC読み取り値をミリボルトに変換する際に`reading << 2`(4倍)と`reading`を足して5倍の近似を行い、ハードウェア乗算器を持たない小型マイクロコントローラのオーバーヘッドを回避します。