ビットの並びを逆にする処理

■ 解き方の方針 元の値rbyteから右端のビットを一つずつ取り出し、結果rへ左から並ぶように積み上げます。各回で「rを左へ1ビット」「右端を追加」「rbyteを右へ1ビット」の三つが必要です。 ■ 一回の処理 r << 1: 既に取り込んだビットを左へ1桁移し、右端を空けます。 rbyte ∧ 00000001: rbyteの最下位ビットだけを取り出します。 ∨: 空いたrの右端へ、取り出したビットを入れます。 rbyte >> 1: 次に取り出すビットをrbyteの右端へ移します。 したがって、繰返し内は「r ← (r << 1) ∨ (rbyte ∧ 00000001)」「rbyte ← rbyte >> 1」です。 ■ 例を確認する 01001011 の右端から1ビットずつ取り出して r に積み上げると、次のように変化します。 回数 取り出すビット(rbyteの右端) r(左へずらして右端に追加) rbyte(右へ1ビット) 1 1 00000001 00100101 2 1 00000011 00010010 3 0 00000110 00001001 4 1 00001101 00000100 5 0 00011010 00000010 6 0 00110100 00000001 7 1 01101001 00000000 8 0 11010010 00000000 8回後の r は 11010010 となり、問題文の例と一致します。 ■ 正解と誤答の見分け方 したがって、正解は ア です。 7ビットずつシフトすると隣のビットを順番に処理できません。また、rbyte自身を回転させるだけの式では、反転済みの結果を別に蓄積できません。

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

関数 rev は8ビット型の引数 byte を受け取り、ビットの並びを逆にした値を返す。
例えば,関数revをrev(01001011) として呼び出すと,戻り値は11010010となる。 なお,演算子 ∧ はビット単位の論理積,演算子 ∨ はビット単位の論理和,演算子 >> は論理右シフト,演算子 << は論理左シフトを表す。例えば,value >> n は value の値を n ビットだけ右に論理シフトし,value << n は value の値を n ビットだけ左に論理シフトする。

[プログラム]
 ○8ビット型: rev (8ビット型: byte)
 8ビット型: rbyte ← byte
 8ビット型: r ← 00000000
 for (iを1から8まで1ずつ増やす)
    
 endfor
 return r

出典令和4年度 基本情報技術者試験 科目B サンプル問題 問6
ア

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