基本情報技術者試験の科目Bのサンプル問題を題材に,ビット列の並びを逆順にする処理について学習します。この問題では,論理シフトとビット単位の論理演算を組み合わせて,ビットを1つずつ取り出して並べ替える方法を確認します。
(令和4年度12月公開) 基本情報技術者試験 サンプル問題 科目B 問6
問 次のプログラム中の に入れる正しい答えを,解答群の中から選べ。
関数 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
整数型: 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
【解答】ア
【解説】
入力されたビット列の右端から1ビットずつ取り出し,それを結果のビット列の右端に順番に追加していくことで,ビットの並びを逆にすることができる。まず,rbyte ∧ 00000001 によって,rbyte の最下位ビットだけを取り出す。例えば,rbyte が 01001011 の場合,最下位ビットは1なので,結果は 00000001 となる。次に,r ← (r << 1) ∨ (rbyte ∧ 00000001) とすることで,r を1ビット左に論理シフトして空いた右端に,取り出したビットを追加する。その後,rbyte ← rbyte >> 1 として,rbyte を1ビット右に論理シフトする。この処理を8回繰り返すと,元のビット列の右端から順番にビットを取り出して,r に並べることになる。したがって,01001011 は 11010010 となる。よって,空欄には r ← (r << 1) ∨ (rbyte ∧ 00000001) と rbyte ← rbyte >> 1 を入れる。
【参考】
関数 rev を rev(01001011) として呼び出した場合の結果は,次のようになる。
この問題のポイント
この問題から学べることは,
- ビット単位の論理積と論理和
- 論理右シフトと論理左シフト
- 最下位ビットを取り出す方法
- ビットを順番に取り出して,ビット列の並びを逆順にする処理
です。特に,ビット単位の論理積で最下位ビットを取り出し,論理左シフトした結果にそのビットを加えることで,ビット列を逆順に並べる処理を理解しておきましょう。
基本情報技術者試験の学習におすすめの参考書
基本情報技術者試験の合格を目指す方におすすめの参考書です。
学習のお役に立ちましたら
この記事が少しでも学習のお役に立ちましたら,今後も分かりやすい解説や学習コンテンツを継続してお届けする励みになります。
よろしければ、このサイトを応援いただけますと嬉しいです。
※OFUSEは,クリエイターやコンテンツ制作を直接支援できるサービスです。


