計算問題の解き方・16/20

左シフトを使った整数倍の求め方

2進数のレジスタの値を「何ビットか左にシフトし、元の値を足す」操作が何倍になるか、または指定された倍率を作る操作はどれかが問われます。nビット左シフトは2^n倍になることを使い、倍率を2のべき乗の和に分けて考えます。

公開過去問での出題:本試験系 4 回・免除試験 12 回(観測値)

覚える式
  • nビット左シフト = 2^n倍(2進数の末尾に0をn個付けるのと同じ)
  • 倍率を2のべき乗の和に分ける(例:5 = 4 + 1)
  • シフトしてから加算:2^n × x + x / 加算してからシフト:(…)× 2^n

解き方の手順

  1. 求める倍率、または問題の操作を、xを使った式で表す準備をします。
  2. 左シフトは1ビットごとに2倍です。nビット左シフトを「× 2^n」に置き換えます。2進数の末尾に0をn個付ける書き方も、nビット左シフトと同じ意味です。
  3. 操作は書かれている順番どおりに式にします。「シフトしてから加える」と「加えてからシフトする」では値が変わるので、かっこの位置に注意します。
  4. 式を展開して「□x」の形にし、倍率を読み取ります。
  5. 選択肢が操作の形で並んでいるときは、1つずつ式に直して展開し、求める倍率と一致するものを選びます。
  6. 2進数以外でも考え方は同じです。基数rの数を1桁左にずらすとr倍になります(16進数なら1桁で16倍)。

例題

数値を 2 進数で格納するレジスタがある。このレジスタに正の整数 x を設定した後,“レジスタの値を 2 ビット左にシフトして,x を加える”操作を行うと,レジスタの値は x の何倍になるか。ここで,あふれ(オーバフロー)は,発生しないものとする。

ア 3
イ 4
ウ 5
エ 6

出典:平成28年度 春期 基本情報技術者試験 午前 問1(解き方は当サイト作成)

解き方と答えを見る
  1. 2ビット左シフトは 2^2 = 4倍なので、xは 4x になります。
  2. そのあとにxを加えるので、4x + x です。
  3. 4x + x = 5x です。
  4. したがって、レジスタの値はxの5倍です。

答え:5倍(ウ)

ひっかけ

  • シフトしたビット数をそのまま倍率と考え、「2ビットだから2倍」として+xで3倍とする誤りです(例題のア)。nビット左シフトは n倍 ではなく 2^n倍 です。
  • シフトだけを計算して、そのあとの「xを加える」を忘れ、4倍とする誤りです(例題のイ)。操作を最後まで式に書き出してから展開します。
  • 操作の順番を入れ替える誤りです。例題で先にxを加えてから2ビット左シフトすると(x + x)× 4 = 8x になり、5x とは別の値です。書かれた順にかっこを付けて式を立てます。
  • 左シフトと右シフトの取り違えです。左シフトは2^n倍、右シフトは2^nで割る(余りは切り捨て)操作です。向きを確かめてから倍率を当てはめます。

類題(手順を使って解く)

類題 1

「末尾に0を付ける」などの2進数の表記を左シフトとして読み替え、3倍を2のべき乗の和で作れるかが試されます。

非負の2進数 b₁b₂…bₙ を3倍にしたものはどれか。

出典:基本情報技術者試験 科目A免除 修了試験 20180722 実施分 問1(問題文は IPA の公開問題。答えと解説はリンク先)

類題 2

ビット位置の重み(何ビット左にあると何倍か)を使い、上位と下位を入れ替えた値をxの式で表せるかが試されます。

0以上65,536未満の整数xを,16ビットの2進数で表現して,上位8ビットと下位8ビットを入れ替える。得られたビット列を2進数とみなしたとき,その値をxを用いた式で表したものはどれか。ここで,a÷bはaをbで割った商の整数部分を,a%bはaをbで割った余りを表す。また,式の中の数値は10進数である。

出典:基本情報技術者試験 科目A免除 修了試験 20171210 実施分 問2(問題文は IPA の公開問題。答えと解説はリンク先)

類題 3

選択肢の操作を書かれた順にかっこ付きの式へ直し、展開して10倍になるものを選べるかが試されます。

数値を 2 進数で表すレジスタがある。このレジスタに格納されている正の整数 x を 10 倍にする操作はどれか。ここで,桁あふれは起こらないものとする。

出典:平成29年度 秋期 基本情報技術者試験 午前 問1(問題文は IPA の公開問題。答えと解説はリンク先)

「左シフトによる2のべき乗倍と加算」の過去問をアプリで解く