💡

基本情報技術者試験|サンプル問題[科目B] 問6

2023/10/17に公開

基本情報技術者試験の勉強中です。わかりにくい問題があったので、解説をメモしておきます。

問題

次のプログラム中の[???]に入れる正しい答えを,解答群の中から選べ。

関数 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の値を最下位から順に取得し、最上位から順に代入し直している。

参考

https://www.fe-siken.com/kakomon/sample/b6.html

Discussion