サンプル問題 [科目B]問6

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
 次のプログラム中の に入れる正しい答えを,解答群の中から選べ。

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

〔プログラム〕
b06_1.png

  • 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
正解 問題へ
分野:アルゴリズムとプログラミング
カテゴリ:プログラムの基本要素
解説
設問で登場する4種類のビット演算の意味は次のとおりです。
論理積(AND)
両方のビットがともに"1"であるときのみ"1"を出力し、それ以外では"0"を出力する。マスクビットの特定箇所を"1"とすることで、他方のビット列からその"1"とした部分のビットを取り出すことができる
b06_2.png
論理和(OR)
少なくとも1つのビットが"1"であるときに"1"を出力し、両方のビットがともに"0"のときのみ"0"を出力する
b06_3.png
論理右シフト
ビット列全体を指定された数だけ右にずらす。はみ出た最下位ビット部分は無視し、先頭ビットは"0"で埋める
論理左シフト
ビット列全体を指定された数だけ左にずらす。はみ出た先頭ビット部分は無視し、最下位ビットは"0"で埋める
  • 正しい。論理積の特徴を踏まえるとrbyte ∧ 00000001の部分では、変数 rbyte の最下位ビットを取得していることがわかります。この取得したビットと1ビット左シフトした変数 r を論理和演算することで、変数 rbyte の最下位ビットが変数 r の最下位ビットにコピーされます。その後、変数 rbyte を右に1つずらすことで、次に取得対象となる最下位ビットを移動させています。
    for文で上記の処理が繰り返されることにより、①変数 rbyte の最下位ビットを取得⇒②変数 r を1ビット左シフト⇒③変数 rbyte の最下位ビットを変数 r の最下位ビットにコピー、④変数 rbyte を1ビット右シフトの流れができ、8回繰り返すと引数 byte の最下位ビットから順に変数 r の先頭ビットに格納されていることとなります。
  • 2行目のrbyte ← rbyte >> 7では、変数 rbyte を7ビット右にシフトした値で更新しています。引数が 01001011 だったと仮定すると、繰返し処理の1回目において rbyte の値が 00000000 に変わることになり、その後の繰返し処理で元のビット列の情報を得ることが不可能になってしまいます。よって不適切です。
  • 変数 r に代入される(rbyte << 1) ∨ (rbyte >> 7)がどのような処理を考えてみると、rbyte << 1は変数 rbyte を1ビット左にシフトするので最下位ビットが0のビット列、rbyte >> 7は変数 rbyte を7ビット右にシフトするので、従前の先頭ビットが最下位ビットの値であり、それ以外は0のビット列となります。この2つのビット列の論理和をとると、ビット列全体を1ビット左にずらして空いた(0埋めされた)最下位ビットの位置に、従前の先頭ビットが入ることになります。
     01001011 << 1 OR 01001011 >> 7
    =10010110 OR 00000000
    =10010110
    //rbyte の先頭ビット(01001011)が最下位ビット(10010110)に移動する
    これを8回繰り返しても、終了時の変数 r は元の引数 byte と同じビット列になるだけなので不適切です。
  • 変数 r に代入される(rbyte >> 1) ∨ (rbyte << 7)がどのような処理を考えてみると、rbyte >> 1は変数 rbyte を1ビット右にシフトするので先頭ビットが0のビット列、rbyte << 7は変数 rbyte を7ビット左にシフトするので、従前の最下位ビットが先頭ビットの値であり、それ以外が0のビット列となります。この2つのビット列の論理和をとると、ビット列全体を1ビット右にずらして空いた(0埋めされた)先頭ビットの位置に、従前の最下位ビットが入ることになります。
     01001011 >> 1 OR 01001011 << 7
    =00100101 OR 10000000
    =10100101
    //rbyte の最下位ビット(01001011)が先頭ビット(10100101)に移動する
    これを8回繰り返しても、終了時の変数 r は元の引数 byte と同じビット列になるだけなので不適切です。
【参考】
rbyte ← 01001011、r ← 00000000
  1. r ← 00000000 OR 00000001 = 00000001
    rbyte ← 00100101
  2. r ← 00000010 OR 00000001 = 00000011
    rbyte ← 00010010
  3. r ← 00000110 OR 00000000 = 00000110
    rbyte ← 00001001
  4. r ← 00001100 OR 00000001 = 00001101
    rbyte ← 00000100
  5. r ← 00011010 OR 00000000 = 00011010
    rbyte ← 00000010
  6. r ← 00110100 OR 00000000 = 00110100
    rbyte ←00000001
  7. r ← 01101000 OR 00000001 = 01101001
    rbyte ← 00000000
  8. r ← 11010010 OR 00000000 = 11010010
    rbyte ← 00000000

Pagetop