左シフトで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倍の近似を行い、ハードウェア乗算器を持たない小型マイクロコントローラのオーバーヘッドを回避します。

試してみる — Bitwise Calculator

フルツールを開く