考え無い。

細けえこたあいいんだよ。

基本情報技術者平成31年春期 午前問2の解き方

基本情報技術者平成31年春期の午前門2の解き方説明。
勉強の一貫でやっているので、間違いがあれば指摘願う。

問題

「最上位をパリティビットとする8ビット符号において、パリティビット以外の下位7ビットをえるためのビット演算はどれか」

平成31年春期問2 下位7ビットを得るためのビット演算|基本情報技術者試験.com

  • ア:16進数0FとのANDをとる。
  • イ:16進数0FとのORをとる。
  • ウ:16進数7FとのANDをとる。
  • エ:16進数FFとのXOR(排他的理論和)をとる

わからないワードが多すぎるのでワードから調べてみる。

問題に出てきたワード集

ビット

2進数を用いる数字、符号。

パリティビット

データが正しいかどうかを確認するビット。
パリティビット以外のビットの”1の数”が偶数個なら「0」で、奇数個なら「1」となる。

参考:https://wa3.i-3-i.info/word16601.html

ただ上記のサイトでは、パリティビットを最下位にしている(一番右に置いている)。今回の最上位は一番左の数字の事。

8ビット符号

符号?ただのビットとは違うの?と思うが、符号付きビットと呼ばれる事もある。

通常の8ビットは0~255の正数のみ表すが、符号が付くと負数も表せるようになる。

最上位が0の場合は正数で、1の場合は負数である。

参考:符号つき2進数

しかし今回の問題は正数負数は関係ないので、特に考えなくて良い。

ビット演算

ビット演算は、ビットを計算する事。

これだとあまりにも雑すぎるので、細かくすると2つの2~16進数を組み合わせてあれやこれやを導き出す事。

問題で出てくるのは「AND」「OR」「XOR」の3つ。
上記3つは、2つのビットを比較した上でそれぞれの特性にあわせて数字を返す。

比較するのは、1桁目同士、2桁目同士、3桁目同士…と、ビット的な表現でいうと「同じ重みを持った数字同士を比較。

AND

AND(&)は比較した際に、両方1なら1を返し、どちらかが0なら0を返す。
1+1=1、1+0=0、0+0=0だ。

OR

OR(|)は比較した際に、両方0なら0を返し、どちらかが1なら1を返す。
1+1=1、1+0=1、0+0=0だ。

ANDとORは1+0が1になるか0になるかの差でしかない。

XOR

XOR(^)は比較した際に、片方が1なら1、どちらも同じ数字なら0を返す。
違う言い方をすれば、数字が違ったら1、同じなら0。
1+1=0、1+0=1、0+0=0だ。

その他

その他もあるようだけど、問題にはないので省略。
上記3つも含め、わかりやすく解説されているページがあるのでそちらを見てみると良い。

qiita.com

どういった問題か

「最上位をパリティビットとする」となっているので、一番左の数字がパリティビットで、それ以外を出したいという事。

つまり、「00000000 から 11111111の範囲内の8ビット符号「A」を「選択肢アイウエ」の16進数と演算で、下位7ビット(下7桁)を全く同じ数字で取り出しせるのはどれ?」

という問題になる。

解き方

まず演算する為には、進数をあわせないと出来ないので8ビット符号を16進数にするか16進数を2進数にしなければならない。

16進数に合わせても良いのかもしれないが、下位7ビットを取り出すので2進数で考えたほうが楽なので、16進数を2進数に変更してみよう。

16進数を2進数に変更

16進数を2進数に変更するには、二桁となっている16進数を10進数にして、その10進数を2進数にする。
面倒臭く聞こえるが、そんなに難しくない。

以下を読むととてもわかりやすい。

www.infraexpert.com

上記を参考に選択肢全ての16進数を2進数に変更するとこうなる。

ア:0F:00001111

イ:0F:00001111

ウ:7F:01111111

エ:FF:11111111

この時点で、なんとなくウかエが正解なんじゃないか…?って雰囲気が多少出ているのがわかるだろうか。
下位7ビット(下7桁)を比較した上で、条件によって0か1が出すのに、わざわざ途中で数字を変更するメリットは無い。
なんなら、勘違いを起こしやすそうである。

演算してみる

さて、演算してみよう。

今回不明となっている16進数で演算する8ビット符号を適当に決めてみよう。今回は「01010101」とする。
下位7ビット(下7桁)を取り出したいので、演算の結果「1010101」となるのが正解になる。

選択肢ア

ANDなので両方1なら1を。それ以外は0を返す。
16進数の0Fは「00001111」。

01010101 + 00001111 = 0000101

下位7ビット(下7桁)が「000101」なので不正解

選択肢イ

ORなので両方0なら0を。それ以外は1を返す。
16進数の0Fは「00001111」。

01010101 + 00001111 = 01011111

下位7ビット(下7桁)が「1011111」なので不正解

選択肢ウ

ANDなので両方1なら1を。それ以外は0を返す。
16進数の7Fは「01111111」。

01010101 + 01111111 = 01010101

下位7ビット(下7桁)が「1010101」なので正解

選択肢エ

XORなので片方1なら1を。それ以外は0を返す。
16進数のFFは「11111111」。

01010101 + 11111111 = 10101010

下位7ビット(下7桁)が「0101010」なので不正解

答え

答えは選択肢エになる。