平成30年度春期 基本情報処理試験 午前問1解説

当サイトでは、IPA主催の基本情報処理試験のうち主に計算問題について解説を行います。計算問題以外については基本的に覚えれば解けますので、頑張って覚えてください。

解説が必要な問題があれば、問い合わせよりご連絡ください。

問1の内容

ある整数値を、負数を2の補数で表現する2進表記法で表すと最下位2ビットは”11″であった。10進表記法の下で、その整数値を4で割ったときの余りに関する記述として、適切なものはどれか。ここで、除算の商は、絶対値の小数点以下を切り捨てるものとする。

ア その整数値が正ならば3
イ その整数値が負ならば-3
ウ その整数値が負ならば3
エ その整数値の正負にかかわらず0

IPA情報処理推進機構より転載

答えはクリックすることで表示されますが、わからない場合はこのページを読んで理解してください。

 
 

おそらく初めて聞いた言葉がある人には問題文が理解できないのではないでしょうか?
難しい言葉が並んでいます。負数?2の補数?なにそれ?ですよね。

紐解いていきましょう。

用語の説明

まず、問題文を理解するために用語から説明していきます。

2進表記法 10進表記法

難しい言い方をしていますが、2進数と10進数のことです。
2進数は0と1の2種類の文字を使用して数値を表します。
10進数は普段の生活で使用している数字で、0~9までの10種類の文字を使用して数値を表します。
ちなみに、そのほかにも基本情報では8進数とか16進数が出ることがあります。

では、”10″と記載があったらどっちの表記なんでしょうか?

もちろん普通は10進表記です。

でもこのような問題であったり、明確に区別する必要がある場合は
(10)2とか(10)10のように下付き文字で表現します。
かっこが逆の場合もあります。10(2)のように。

10進表記と2進表記で値の表現は次の表ようになります。

10進表記 2進表記
0 0
1 1
2 10
3 11
4 100
5 101
6 110
7 111
8 1000
9 1001
10 1010
11 1011
12 1100
13 1101
14 1110
15 1111
16 10000

16までの値を記載したが、10進と2進の変換方法はお分かりだろうか。
変換ルールは後述します。

負数、補数

負数とはマイナス数字のことです。マイナス1とかマイナス2など0より小さい数字のことになります。
補数とは以下のように定義されています。

ある自然数aに足したときに桁が1つ上がる(桁が1つ増える)数のうち最も小さい数をいう。

wikipediaより転載

つまり、(7)10の補数は(3)10です。(7)10は1桁で、これに(3)10を足すと(10)10と2桁になりますね。
同じ値を2進で表すと(111)2であり、この補数は(1)2である。

ちなみに問題文に「2の補数で表現する2進表記法」という記載があることからも推測できるとおり、問題文の2の補数というのは「2進数の補数」という意味ではないです。

基本情報試験で覚える必要はないと思うが、2進数には1の補数、2の補数というのがあります。〇進数には〇の補数と〇-1の補数が存在します。10進数では10の補数と9の補数があります。

また問題文にあるように「2の補数で表現する2進表記法」のように「△の補数で表現する□進表記法」と△と□部分の値が同じであれば、桁が1つ上がる数字を求めればよいということになります。△と□が異なる場合など、詳しくはwikipediaを参照してください。

変換方法

まだ問題には入れません。10進数と2進数の変換方法や補数の求め方がわからないと問題は解けません。

10進数と2進数の変換の行い方

10進数から2進数への変換方法

まずは10進数から2進数への変換の行い方です。
わかりやすいように小さな数値で説明します。大きな数値でもやり方は同じです。

例えば、(11)10を2進数に変換します。

  1. 11を2で割り算します。5余り1です。
  2. 5を2で割ります。2余り1です。
  3. 2を2で割ります。1余り0です。

商の部分が1になったら終了です。
最初に求めた余りから右から順に記載し、一番左に最後の商となった1を付けたし、(1011)2となります。

もう一つ例として(16)10を2進数に変換します。

  1. 16を2で割り算します。8余り0です。
  2. 8を2で割ります。4余り0です。
  3. 4を2で割ります。2余り0です。
  4. 2を2で割ります。1余り0です。

商が1になったので終了です。同じように求めた余りから右から順に記載し、一番左に最後の商となった1を付けたし(10000)2となります。簡単ですね!

2進数から10進数への変換方法

続いて逆の2進数から10進数への変換の行い方です。
これもわかりやすいように小さな数値で説明します。
例として(1010)2を変換します。

  1. 2進数の文字列の上に右から1,2,4,8と1から倍々で数字を振ります。
  2. もともとの2進数で1の部分の数字を足していきます。

わかりずらいので、図にしました。

結果、(1010)2は(10)10ということになります。

倍々ですが、1,2,4,8,16,32,64,128,256,512,1024とこの辺あたりまでは暗記しておきましょう。

補数の求め方

おさらいですが、補数とはなんでしたでしょうか?
補数とは「その数値に足すことで桁が上がる最小の数値」のことです。

つまり1桁の(7)10の場合、2桁にするために足すの最小の数値は
(10)10から(7)10を引いて(3)10です。

これは10進数の場合ですが、2進数の場合はどうでしょうか。

4桁の(1011)2の場合、5桁にするためには何を足すのでしょうか?
求め方は理屈抜きで覚えてましょう。

  1. (1011)2の1と0を反転させます。(0100)2となります。
  2. (0100)2に(1)2を加えます。(0101)2となります。
    頭の0は不要ですので、(101)2が補数となります。

補数の必要性

補数の求め方について理解できたでしょうか。では、補数を求めて何に使うのか?必要性を見ていきましょう。

補数を用いることで実は減算処理(引き算)ができるようになるんです。
コンピュータは引き算が苦手で足し算が得意なんです。足し算で引き算を行っています。

どういうことか。

例えば、10進数の654-320=334 という計算をするときに補数を用いれば、足し算で求めることができます。

320の補数を求めます。320の補数は680です。
これを654に加算すれば、1334になります。この時、4桁目(千の位)を無視すると、
334が導けます。不思議ですね。答えと一緒の値になりました。
4桁目を無視するといいましたが、コンピュータの世界では取り扱う桁数が増えるということはありません。あらかじめ決まっています。
例えば、0654-0320 とした場合でも、0320の補数は9680になり、0654を加えると10334となり、
5桁目を無視して、0334となります。
このように補数を使えば引き算が足し算で求めることができるのです。

ここで注意が必要です。補数を求める際には必ず桁数は合わせてください。

654-85=569 の場合、85の補数は15ではなく、915で計算します。

2進数でも同様です。
(111)2-(010)2=(101)2も同じように計算します。
(010)2の補数を求めます。補数は0,1を反転して1を足すでしたね。

(010)2の補数は(110)2となります。
(111)2に(110)2を足すと、(1101)2となりますが、桁数は増えませんので、(101)2となります。

つまり、補数は桁数が増えない前提で考えるとマイナス値を表していることがわかります。

補数はマイナス値を表すことはわかりましたが、表記上それが通常の表記なのか、補数なのか、判断がつきません。問題文に戻ってみますが、あえて「負数を2の補数で表現する2進表記法で表す」と記載がありますね。問題では通常このように記載がありますし、コンピュータの世界でも負数は補数で表現しています。

補数で表現する場合、先頭の桁に符号の代わりになる数値をつけます。0は正の数値。1は負の数値を表します。
(0111)2は(7)10となり、(1110)2は(-2)10となります。

回答解説

4桁の2の補数で表現した場合の一覧は次のようになります。この表が理解できればこの問題は一気に正解に近づきます。

10進表記 2の補数で表現する2進表記(4桁)
-8 1000
-7 1001
-6 1010
-5 1011
-4 1100
-3 1101
-2 1110
-1 1111
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111

2進表記で最下位が”11″となっている10進表記は
負数では-5と-1となり、
正数では3と7です。

問題文で「除算の商は、絶対値の小数点以下を切り捨てる」とあります。ポイントは「絶対値」です。

つまり、
負数の-5と-1の絶対値は5と1です。
正数の3と7の絶対値はそのまま3と7です。

この2つの数字から回答の選択肢に当てはまるものを選べばよいわけですね。

正解は、「ア その整数値が正ならば3」ですね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です