忍者ブログ
情報処理技術者試験の合格を目指す全受験者のための、1問1問「徹底解説」ブログです。単なる過去問の暗記ではなく、なぜその答えになるのかを本質的に理解できるよう解説します。書籍などでは学べない最新用語やトレンドを踏まえてご紹介します。

【基礎理論】符号を固定するか・含めて動かすか!「論理シフト」と「算術シフト」|情報処理問題1000本ノック

基本情報技術者試験や応用情報技術者試験のアルゴリズム・基盤テクノロジ分野で必ず出題される超定番テーマ。「論理シフト」と「算術シフト」の動作の違いと、空いたビットに補充する値のルールを攻略しましょう。

1. 【 問題 】:テクノロジ系(基礎理論・ビット演算)

【 問題 】 コンピュータ内部のビット演算に関する記述です。最上位ビット(MSB)を符号ビットとして維持し、負の数の補数表示を保ったまま掛け算や割り算(2の乗除)を行うために、符号を考慮して実行されるシフト演算は、次のうちどれか。

(ア)論理シフト
(イ)算術シフト
(ウ)ローテート(循環シフト)
(エ)キャリー付きシフト

2. 正解:

正解:(イ)算術シフト

3. 解説:「『符号ビットをいじるか・固定するか』が運命の分かれ道!」

シフト演算は、ビット列を左右にズラすことで、高速に2の乗算(左シフト)2の除算(右シフト)を行う処理です。
数値データ(特に負の数)を扱う際には、符号を壊さないように算術シフトを行う必要があります。

【論理シフトと算術シフトの相違点一覧】 ← 超・頻出計算問題の基礎!

シフトの種類符号の考慮左シフト(2倍, 4倍…)の補充ビット右シフト(1/2, 1/4…)の補充ビット
(ア)論理シフト 考慮しない
(全ビットを等しく移動)
右端の空き領域に 「0」 を詰める。 左端の空き領域に 「0」 を詰める。
(イ)算術シフト 考慮する
(最上位の符号ビットを固定)
符号ビットを残して移動。
右端に 「0」 を詰める。
符号ビットを残して移動。
左端に「元の符号ビットと同じ値(0または1)」を詰める。

1. 理解のコツ:
論理シフト:ビット列をただの「データ(文字列のようなもの)」として扱い、機械的にスライドさせます。
算術シフト:ビット列を「プラス・マイナスのある数値」として扱い、正負の符号(最上位ビット)を絶対に保持したままスライドさせます。

2. 計算問題での重要注意点(算術右シフト):
負の数(最上位ビットが `1`)を算術右シフトする場合、空いた左端には「0」ではなく「1」が補充される点に十分注意してください!(そうしないと負の数が正の数に化けてしまいます)。


4. まとめ

符号を考慮せず機械的にビットをずらすのが論理シフト、符号ビットを固定して数値の正負を維持したまま演算を行うのが算術シフトです。空いた領域に何を補填するか(特に算術右シフトのルール)までセットで完璧に覚えておきましょう!

PR