Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

論理シフト(ロジカルシフト)とは | 意味や読み方など丁寧でわかりやすい用語解説

論理シフト(ロジカルシフト)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

読み方

日本語表記

論理シフト (ロンリシフト)

英語表記

logical shift (ロジカルシフト)

用語解説

論理シフトとは、コンピュータがデータを処理する際に行う基本的なビット操作の一つで、数値やビット列を構成する個々のビットを左または右に指定された桁数だけずらし、空いた部分を常にゼロで埋める処理を指す。この操作は、主に符号なし整数に対する乗除算の高速化や、ビット列を扱う際の特定ビットの抽出・操作などに用いられる。

コンピュータ内部では、すべての情報はビット(0か1の二進数)の並びとして表現される。例えば、8ビットで数値「11」は「00001011」と表される。論理シフトは、このようなビットの並びを物理的にずらすことで、データの位置を変更したり、特定の演算を高速に行ったりするための命令である。

具体的には、論理シフトには「左論理シフト」と「右論理シフト」の二種類がある。 左論理シフトは、ビット列全体を左方向へ指定されたビット数だけずらす操作である。このとき、ビット列の右端に新しく空いたビットには常にゼロが挿入される。一方、左端からあふれ出たビットは捨てられ、失われる。例えば、8ビットの数値「00001011」(十進数で11)を1ビット左論理シフトすると、「00010110」(十進数で22)となる。この例では、最上位ビットであった「0」が捨てられ、最下位ビットに「0」が挿入された。この操作は、結果として元の数値を2のN乗倍することに相当する。1ビット左シフトは2倍、2ビット左シフトは4倍、というように元の数値に2をN回掛けた値が得られる。これは、CPUがシフト命令を非常に高速に実行できるため、一般的な乗算命令よりも効率が良い場合があり、特に組み込みシステムや高速な数値計算が求められる場面で活用される。

右論理シフトは、ビット列全体を右方向へ指定されたビット数だけずらす操作である。このとき、ビット列の左端に新しく空いたビットには常にゼロが挿入される。一方、右端からあふれ出たビットは捨てられ、失われる。例えば、8ビットの数値「00001011」(十進数で11)を1ビット右論理シフトすると、「00000101」(十進数で5)となる。この例では、最下位ビットであった「1」が捨てられ、最上位ビットに「0」が挿入された。この操作は、結果として元の数値を2のN乗で割ることに相当する。1ビット右シフトは2で割る、2ビット右シフトは4で割る、というように元の数値を2でN回割った値(整数部分)が得られる。左論理シフトと同様に、これも乗算と同様に高速な除算として利用される。ただし、これは符号なし整数(非負の数)に対して正確な2のN乗割算となる。

論理シフトの主要な用途は、前述の2のN乗倍・割算の高速化に加え、ビット列の細かな操作にもある。例えば、あるビット列から特定の範囲のビットだけを取り出したい場合(ビットフィールドの抽出)、対象のビット列を右シフトして目的のビットを最下位に揃えてから、ビットマスクを使って不要なビットをクリアするといった操作によく使われる。また、複数の小さな情報を1つの大きなデータに詰め込む(パック)際や、詰め込まれた情報を取り出す(アンパック)際にも、シフト操作と論理演算(AND, ORなど)が組み合わせて用いられる。デバイスドライバ開発や組み込みプログラミングでは、ハードウェアレジスタへのビット単位のアクセスが頻繁に行われるため、論理シフトは非常に重要な操作となる。

他のシフト操作と比較すると、論理シフトの特性がより明確になる。一つは「算術シフト」である。算術シフトもビット列をずらす操作だが、主に符号付き整数に対して用いられる点が論理シフトと異なる。左算術シフトは左論理シフトと同じ動作をするが、右算術シフトでは、空いた最上位ビットに元の最上位ビット(符号ビット)の値がコピーされる。これにより、負の数であっても符号を維持したまま2のN乗割算を行うことができる。例えば、-10 (二進数で「11110110」※8ビット2の補数表現) を1ビット右算術シフトすると、-5 (「11111011」) となる。論理シフトでは常に0を詰めるため、負の数を右論理シフトすると符号が変わってしまう場合がある。もう一つは「循環シフト(ローテートシフト)」で、これはビットが端からあふれたときに捨てられるのではなく、反対側の端に戻ってくるという動作をする。ビットの情報を失わずに、ビット列内の位置だけを移動させたい場合に利用される。

多くのプログラミング言語では、論理シフト操作のための演算子が用意されている。C言語やJava、Pythonなどでは、左シフトには<<演算子が使われ、これは論理左シフトとして機能する。右シフトには>>演算子が使われるが、その動作は言語やデータの型によって異なる場合がある。特にC言語やJavaでは、符号付き整数に対して>>を使用すると算術右シフトとして動作することが一般的である。そのため、符号付き整数に対して明示的に論理右シフトを行いたい場合は、Javaの>>>演算子のように、論理右シフト専用の演算子が提供されている場合がある。C言語では、符号なし整数に対して>>を使用することで論理右シフトとして機能させることができるため、意図した動作を得るためにはデータ型を意識することが重要である。

このように論理シフトは、コンピュータがデータを効率的に操作するための基本的なツールであり、ビット単位での精密な制御や、特定の演算の高速化に不可欠な技術である。システムエンジニアを目指す上では、その原理と応用をしっかり理解しておくことが、低レベルのプログラミングやパフォーマンス最適化の知識を深める上で非常に役立つ。

関連コンテンツ