基本情報技術者試験の
過去問道場を教える
授業をしているのですが
新制度サンプル問題
科目B問6の解き方が
オンラインだと教えにくい。
なので
ブログ形式で書いて
わかりやすく
教えれるように
したいと思います。
まず
科目B問6の
問題文ですが
問6
次のプログラム中の□に入れる
正しい答えを、
解答群の中から選べ。
関数revは8ビット型の
引数byteを受け取り、
ビットの並びを逆にした値を返す。
例えば、
関数revをrev(01001011)
として呼び出すと、
戻り値は
11010010となる。
なお、演算子^はビット単位の論理積、
演算子vはビット単位の論理和、
演算子>>は論理右シフト、
演算子<<は論理左シフトを表す。
例えば、value>>nは
valueの値をnビットだけ
右に論理シフトし、
value<<nは
valueの値をnビットだけ
左に論理シフトする。
[プログラム]
○8ビット型: rev(8ビット型:byte)
8ビット型rbyte ← byte
8ビット型r ← 00000000
整数型: i
for(iを1から8まで1ずつ増やす)
□
endfor
return r
ア r ← (r <<1) v (rbyte ^ 00000001)
rbyte ← rbyte >> 1
イ r ← (r<<7) v (rbyte ^ 00000001)
rbyte ←rbyte >> 7
ウ r ← (rbyte << 1) v (rbyte >> 7)
rbyte ← r
エ r ← (rbyte >>1) v (rbyte << 7)
rbyte ← r
となっています。
では解いていきたいと
思います。
答えは
アなのですが
アの通りに
してみると
プログラムが
return rになってるので
この表を見てわかるように
黄色く塗りつぶしている
r=11010010が
緑で塗りつぶしている
rbyte=01001011の
逆になってることが
わかります。
なので答えは
アです。
この問題の
重要なポイントは
図の中で
水色の線で
表したように
rは
r ← (r <<1) v (rbyte ^ 00000001)
された後に
次の繰り返し時に
左に1ビット
論理シフトされる
ということです。