右シフトで2で割る

右シフト(>>)で2^Nで割る仕組みを学びます。符号付き数値における算術(>>)と論理(>>>)右シフトの違いを理解します。

Shift Operations

詳細な説明

右シフト(>>)による除算

バイナリ数値を1位置右にシフトすることは2で整数除算することと同等です。N位置右にシフトすると2^Nで割ります(符号付き値では負の無限大方向に切り捨て)。

仕組み

  40      = 00101000
  40 >> 1 = 00010100  (20、つまり40 / 2)
  40 >> 2 = 00001010  (10、つまり40 / 4)
  40 >> 3 = 00000101  ( 5、つまり40 / 8)

各シフトで最右ビットが削除され、すべてのビットが1位置右に移動します。正の数では空いた上位ビットは0で埋められます。

算術 vs 論理右シフト

  • >>(算術): 空いた上位ビットを符号ビットで埋めます。負の数は負のままです。
  • >>>(論理、符号なし): 常に0で埋めます。負の数は大きな正の数になります。
  -8(符号付き8ビット) = 11111000
  -8 >> 1               = 11111100  (-4、符号保持)
  -8 >>> 1(32ビット)   = 01111...1100  (2147483644)

丸め動作

正の数では>>はゼロに向かって切り捨て(Math.floor(n/2)と同じ)。負の数では負の無限大に向かって切り捨て:

  • -7 >> 1 = -4(-3ではない)
  • Math.floor(-7 / 2) = -4(一致)
  • Math.trunc(-7 / 2) = -3(異なる!)

使い分け

符号を保持したい符号付き整数では>>を使用します。値を符号なしとして扱う場合(ハッシュ関数、カラーチャネルなど)は>>>を使用します。

ユースケース

オーディオ処理エンジニアはリアルタイムDSPコードで高速な音量減衰のために右シフトを使用します。6 dBの音量削減は振幅の約半分で、1回の右シフトで実行できます。16ビットオーディオサンプルでは`sample >> 1`がゼロレイテンシーで浮動小数点オーバーヘッドなしに音量を半減します。制約のあるハードウェアでのリアルタイム処理に不可欠です。

試してみる — Bitwise Calculator

フルツールを開く