算術シフト
算術シフトとは、符号付きの2進数のビットパターンを右、あるいは、左へずらすことである。
算術シフトでは、符号ビットを除いたビットパターンをずらし、符号ビットはずらさない。あふれたビットは切り捨てて、空いた部分に「0」を挿入する。例えば、符号付き2進数の「11110111」(10進数で-9)を左へ1ビットシフトした場合は「11101110」(10進数で-18)になる。
算術シフトでビットパターンを右へずらす場合、あふれたビットは切り捨てるが、空いた部分には符号ビットと同じ値を挿入する。例えば、「10110100」(10進数で-76)を右へ1ビットシフトした場合は「11011010」(10進数で-38)となり、「00110100」(10進数で52)を右へ1ビットシフトした場合は「00011010」(10進数で26)になる。
情報処理: | 例示字形 論理シフト ストリーム 算術シフト セマンティックWeb セマンティック検索 セマンティック検索エンジン |
算術シフト
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/03/30 05:01 UTC 版)
算術シフトでは、右シフトにおいて、最上位ビット(2の補数表現であれば符号ビット)は保存される。左シフトでは、空くビット位置には、ゼロが入る。このシフトではあふれたビットは単に消える(プロセッサの実装によってはフラグに入るものもある)。下記の例は 4ビットレジスタの場合である。 0111 LEFT-SHIFT= 1110 1011 RIGHT-SHIFT= 1101 前者の例は、左端の0はあふれて消え、あらたな0が右端に入れられている。後者の例は、右端の1はあふれて消え、符号ビット1が左端にコピーされている。あふれたビットは、多くの場合キャリーフラグにセットされる。マルチプルシフトは、シングルシフトをくりかえしたものと同じ結果になる。 0111 LEFT-SHIFT-BY-TWO= 1100 C/C++では、左シフトと右シフトは "<<" と ">>" で表される。シフトする幅は右オペランドにより指定できる。#注意事項も参照。 x = y << 2; この例では、y を2桁左に算術シフトした結果を x に格納する。 1ビットの左算術シフトは2倍するのと同じである。1ビットの右算術シフトは、値が非負であれば2で割ってあまりを捨てるのと同じである。 負の値を右に算術シフトした場合は、シフトしてあふれたビットが1なら(複数シフトの場合は、あふれたビットの中に1がある場合には)、結果に1を足せば、2または2のべきで割ってあまりを捨てるのと同じになる。
※この「算術シフト」の解説は、「ビット演算」の解説の一部です。
「算術シフト」を含む「ビット演算」の記事については、「ビット演算」の概要を参照ください。
- 算術シフトのページへのリンク