ビットシフト 【bit shift】 シフト演算
概要
ビットシフト(bit shift)とは、ビット列を指定した数だけ右または左にずらす操作のこと。単にシフトと呼ぶこともある。シフトしてあふれたビットを反対側の端から順に挿入していく演算は「環状シフト」あるいは「ローテート」(ビットローテーション)という。マイクロプロセッサなどが実行できる最も基本的な演算の一つで、加減算よりも単純な論理回路で実現でき高速に実行することができるため、様々なデータ処理・計算の一部としてよく用いられる。
ほとんどのプロセッサはビットシフトを行うための命令語が用意されており、アセンブリ言語にも対応する命令が存在する。また、多くのプログラミング言語にも加減算などと共にビットシフトのための演算子などが用意されている。
右シフトと左シフト
ビット列全体を下位ビット側に移動することを右シフト、上位ビット側に移動することを左シフトという。移動の結果、端からあふれた値は消滅し、反対側から同じだけ0(算術右シフトでは符号ビットのコピー)が挿入される。CPU内部の処理として、あふれたビットの値をキャリーフラグに代入する動作が行われることもある。
ビット列が整数を表す場合、右へ1ビット移動するごとに値が半分になり、左へ1ビット移動するごとに値が2倍になる。複数ビット移動すると2のべき乗倍あるいは2のべき乗分の1を得ることができる。この性質を利用して、算術演算の実装の一部にシフト演算が組み込まれる場合がある。
算術シフトと論理シフト
最上位ビットは変化させず残りのビット列でシフトを行うものを「算術シフト」(arithmetic shift)、全ビットを一律に移動させるものを「論理シフト」(logical shift)という。
前者は最上位ビットを符号ビットとして符号付き整数を表現する場合に、負数でもシフトによって2のべき乗の乗算を行うことができる。例えば、「1010」を右に1ビット論理シフトすると左端に0が補充され「0101」になるが、右に1ビット算術シフトする場合は符号ビットのコピーが補充され「1101」となる。
(2021.5.2更新)