算術シフト (サンジュツシフト) とは | 意味や読み方など丁寧でわかりやすい用語解説

作成日: 更新日:

算術シフト (サンジュツシフト) の読み方

日本語表記

算術シフト (サンジュツシフト)

英語表記

Arithmetic shift (アリテマティックシフト)

算術シフト (サンジュツシフト) の意味や用語解説

算術シフトとは、コンピュータが数値をビット単位で操作する基本的な演算の一つである。特に、符号付き整数(正の数と負の数)に対して、その値の乗算や除算に相当する効果を高速に実現するために用いられる。ビット列を左右にずらすことで数値を効率的に変更する操作であり、論理シフトとは異なり、符号ビットの扱いに特別な配慮がなされる点が最大の特徴となる。この操作は、プロセッサの基本的な命令として提供され、コンパイラによる最適化や低レベルプログラミングで頻繁に利用される。 算術シフトは、ビット列を左方向へずらす「算術左シフト」と、右方向へずらす「算術右シフト」に大別される。 算術左シフトは、ビット列全体を左方向へ指定されたビット数だけずらす操作である。ずらされたビットの右端(最下位ビット側)には常に0が挿入される。この操作は、数値に2のN乗を乗算することと等価になる。例えば、ある整数を1ビット算術左シフトすると、その値は2倍になる。2ビット算術左シフトすると4倍になる。この操作において、最上位ビット(符号ビットを含む)より左にはみ出すビットは失われる。もしはみ出すビットと符号ビットが異なる値であれば、結果として符号が反転したり、予期しない大きな値になったりする可能性がある。これはオーバーフローと呼ばれる状態であり、結果の正確性が失われる原因となる。具体例として、8ビット符号付き整数「5」(2進数表現で00000101)を1ビット算術左シフトする場合、結果は「10」(00001010)となる。また、8ビット符号付き整数「-3」(2の補数表現で11111101)を1ビット算術左シフトする場合、結果は「-6」(11111010)となる。ここでも、符号ビットは元の負の数を維持しつつ、絶対値が2倍になる。しかし、「64」(01000000)を1ビット算術左シフトすると、「-128」(10000000)となり、これは正の数から負の数へのオーバーフローを示す。 算術右シフトは、ビット列全体を右方向へ指定されたビット数だけずらす操作である。算術右シフトの最大の特徴は、最上位ビット(符号ビット)の値が、シフト操作によって新しく生成される左端のビットにコピーされる点にある。これを「符号拡張」または「符号ビットの維持」と呼ぶ。これにより、シフト後の数値の符号は元の数値の符号と同じに保たれる。この操作は、数値に2のN乗を除算することと等価になる。例えば、ある整数を1ビット算術右シフトすると、その値は2で除算される。2ビット算術右シフトすると4で除算される。ただし、これは常に正確な除算を意味するわけではない。特に負の数に対する除算では、通常の数学的な除算とは異なり、結果は常に整数値に丸められる。この丸め動作はプロセッサやプログラミング言語によって異なる場合があるが、多くのシステムでは「ゼロ方向への丸め」(例えば -5 を 2 で割ると -2)が行われる。具体例として、8ビット符号付き整数「10」(00001010)を1ビット算術右シフトする場合、結果は「5」(00000101)となる。8ビット符号付き整数「-6」(2の補数表現で11111010)を1ビット算術右シフトする場合、結果は「-3」(11111101)となる。ここで、左端には元の符号ビットである「1」が複製されて挿入され、負の数であるという符号が保たれている。 算術シフトと対比されるものに論理シフトがある。論理シフトは、符号の有無にかかわらず、ビット列を移動させる際に空いたビット位置に常に0を挿入する。論理左シフトは算術左シフトと同一の動作をする。どちらも左にシフトする際に右端に0を挿入するためである。しかし、論理右シフトは算術右シフトとは異なる。論理右シフトでは、左端に常に0が挿入される。このため、負の数を論理右シフトすると、符号ビットであった「1」が失われ、結果として正の数になってしまう。例えば、8ビット符号付き整数「-6」(11111010)を1ビット論理右シフトすると、「123」(01111101)となる。これは元の符号を完全に無視しており、数値としての意味合いが大きく変わってしまう。そのため、符号付き整数に対して乗算や除算に相当する効果を得たい場合は、算術シフトが適切であり、符号なし整数や単にビット列を操作したい場合には論理シフトが用いられる。 算術シフトは、コンパイラがプログラミング言語の乗算(例えば `*2` や `*4`)や除算(例えば `/2` や `/4`)の操作を、より高速なCPU命令に変換する際の最適化手法として広く利用される。特に組み込みシステムやアセンブリ言語でのプログラミングにおいては、CPUサイクルを節約し、実行速度を向上させるために直接的に算術シフト命令が用いられることがある。注意点としては、算術左シフトにおけるオーバーフローの発生である。シフト操作によって値が表現可能な範囲を超えてしまうと、結果が正しくなくなる。プログラミングにおいては、このようなオーバーフローが発生しないように、シフトするビット数を適切に選択したり、結果の値をチェックしたりするなどの考慮が必要となる。また、算術右シフトによる除算は、浮動小数点数のような正確な除算ではなく、常に整数値に丸められる。この丸め動作はプロセッサやプログラミング言語によって異なる場合があるため、特定の挙動に依存するコードを書く際には注意が必要である。一般的には、正の数では通常の切り捨てと同じ動作をし、負の数ではゼロ方向への丸めが行われることが多い。これらの特性を理解することで、算術シフトがコンピュータ内部でどのように数値を効率的に操作し、プログラミングにおいてどのような役割を果たすかを深く理解できる。システムエンジニアを目指す上で、このような低レベルの操作を把握することは、効率的なアルゴリズムの設計やパフォーマンスチューニングの基礎となる。

算術シフト (サンジュツシフト) とは | 意味や読み方など丁寧でわかりやすい用語解説