右シフトで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`がゼロレイテンシーで浮動小数点オーバーヘッドなしに音量を半減します。制約のあるハードウェアでのリアルタイム処理に不可欠です。