基本情報技術者試験|サンプル問題[科目B] 問6
基本情報技術者試験の勉強中です。わかりにくい問題があったので、解説をメモしておきます。
問題
次のプログラム中の[???]に入れる正しい答えを,解答群の中から選べ。
関数 rev は8ビット型の引数 byte を受け取り,ビットの並びを逆にした値を返す。例えば,関数 rev を rev(01001011) として呼び出すと,戻り値は11010010となる。
なお,演算子∧はビット単位の論理積,演算子∨はビット単位の論理和,演算子>>は論理右シフト,演算子<<は論理左シフトを表す。例えば,value >> n は value の値を n ビットだけ右に論理シフトし,value << n は value の値を n ビットだけ左に論理シフトする。
〔プログラム〕
8ビット型:rev(ビット型:byte)
8ビット型:rbyte ← byte
8ビット型:r ← 00000000
整数型:i
for(iを1から8まで1ずつ増やす)
[???]
endfor
return r
【選択肢】
(ア)
r ← (r << 1) ∨ (rbyte ∧ 00000001)
rbyte ← rbyte >> 1
(イ)
r ← (r << 7) ∨ (rbyte ∧ 00000001)
rbyte ← rbyte >> 7
(ウ)
r ← (rbyte << 1) ∨ (rbyte >> 7)
rbyte ← r
(エ)
r ← (rbyte >> 1) ∨ (rbyte << 7)
rbyte ← r
解答・解説
正解は(ア)。
r = (r << 1) v (rbyte ∧ 00000001)
この部分では、
r(00000000) に新しい値を代入しようとしている。
新しい値は (r << 1)でrを1ビット左シフトさせ、rの一番右の位に入れる。
新しい値は (rbyte ∧ 00000001)で計算された値である。
(rbyte ∧ 00000001)の計算結果は、
rbyteの一番右の値が1であれば 00000001 になり、
rbyteの一番右の値が0であれば 00000000 になる。
*∧(論理積)
は比較されている2つの値がどちらも1である場合にのみ1を返すから。
rbyte ← rbyte >> 1
次に、この部分でrbyteを右に1ビットシフトして、次に上記の処理をする値を更新している。
上記の処理を繰り返すことで、rbyteの値を最下位から順に取得し、最上位から順に代入し直している。
参考
Discussion