みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

「左算術シフト」について

「算術シフト」についての質問です。

算術シフトには「右シフト」「左シフト」というものがあり、
「右算術シフト」の場合は、右シフトする時、一番左側の数(符号)が

「0」の場合→一番左側から「0」を補う。
「1」の場合→一番左側から「1」を補う。

ということですが、「左算術シフト」だとこんな感じでよろしいのでしょうか?
一番左側の数(符号)→そのまま(固定のまま)
二番目の左側の数(符号)→捨てる
三番目以降の左側の数(符号)→左へスライド
最後(一番右側)の数(符号)→右からゼロを補う

↑私の考えだと「左算術シフト」はこういうのものだと思いますが、こんな解釈でよろしいのでしょうか?

よろしくお願いします。

投稿日時 - 2019-02-02 10:20:42

QNo.9583789

すぐに回答ほしいです

質問者が選んだベストアンサー

 あってますよ。
 要するに、算術シフトでは、符号ビット(一番左・最上位ビット)は変化させないというのが肝要です。

投稿日時 - 2019-02-02 10:45:53

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

CPUに依ります。
PCで主流のx86、x64のCPUだと、算術左シフトは論理左シフトと同じ動作で、符号ビットを保存しません。右のビットで上書きします。
また、C言語の符号付き数に対しての左シフトも、符号ビットを保存しません。

ところが、情報処理技術者試験で使われるCASLIIという仮想的なCPUだと、算術左シフトは、質問にお書きの動作をするようになっています。
実際に物理的に存在するCPUでそういう動作をする物は知りません。
算術シフト命令は、右シフトしかないCPUもあります。

左シフトを行うと、あふれが無い限り、値が2倍になるというのは理解されていますでしょうか?符号ビットがどちらのケースでも、その右のビットが符号ビットと異なる場合は、数値のオーバーフローが発生して、値が2倍になりません。

普通の環境では、符号ビットを保存しない左シフトを行っている理由としては、その方が都合が良いからです。

例:符号付き8ビット数値で、-100 は、1001 1100 です。
符号保存で左シフトすると、1011 1000 で、10進数に直すと -72 です。
符号上書きで左シフト(論理シフトと同じ)すると、0011 1000 で、10進数に直すと 56 です。
つまり、どちらも -200 ではなく(-200は符号付き8ビット数値で表せないので)2倍になっていません。

符号上書きで左シフトすると、左に1があふれます。この1を繰り上がりとすして、符号付き9ビット数値 1 0011 1000 と考え、それを10進数に直すと -200 になり2倍になっています。符号保存で左シフトした 1011 1000 だとこういう繰り上がり処理が出来ません。

投稿日時 - 2019-02-02 13:52:57

ANo.2

コンピュータの世界では数字を2ビット値で管理していて、最上位ビットは符号ビットです。
たとえば8ビットの場合二進数でいう00000001~01111111が10進数の1~127を表し、100000000~11111111が-127~-1を表してます。
その上で、算術ビットシフトというのは符号、つまりプラスかマイナスかの値は変えないままビットシフトしましょう、ということです。
なので二進数の01111111を左算術シフトするなら01111110になります。

投稿日時 - 2019-02-02 10:54:44

あなたにオススメの質問