サンプル問題 [科目B]問6
問6解説へ
次のプログラム中の に入れる正しい答えを,解答群の中から選べ。
関数 rev は8ビット型の引数 byte を受け取り,ビットの並びを逆にした値を返す。例えば,関数 rev を rev(01001011) として呼び出すと,戻り値は11010010となる。
なお,演算子∧はビット単位の論理積,演算子∨はビット単位の論理和,演算子>>は論理右シフト,演算子<<は論理左シフトを表す。例えば,value >> n は value の値を n ビットだけ右に論理シフトし,value << n は value の値を n ビットだけ左に論理シフトする。
〔プログラム〕
関数 rev は8ビット型の引数 byte を受け取り,ビットの並びを逆にした値を返す。例えば,関数 rev を rev(01001011) として呼び出すと,戻り値は11010010となる。
なお,演算子∧はビット単位の論理積,演算子∨はビット単位の論理和,演算子>>は論理右シフト,演算子<<は論理左シフトを表す。例えば,value >> n は value の値を n ビットだけ右に論理シフトし,value << n は value の値を n ビットだけ左に論理シフトする。
〔プログラム〕
- 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種類のビット演算の意味は次のとおりです。
rbyte ← 01001011、r ← 00000000
- 論理積(AND)
- 両方のビットがともに"1"であるときのみ"1"を出力し、それ以外では"0"を出力する。マスクビットの特定箇所を"1"とすることで、他方のビット列からその"1"とした部分のビットを取り出すことができる
- 論理和(OR)
- 少なくとも1つのビットが"1"であるときに"1"を出力し、両方のビットがともに"0"のときのみ"0"を出力する
- 論理右シフト
- ビット列全体を指定された数だけ右にずらす。はみ出た最下位ビット部分は無視し、先頭ビットは"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これを8回繰り返しても、終了時の変数 r は元の引数 byte と同じビット列になるだけなので不適切です。
=10010110 OR 00000000
=10010110
//rbyte の先頭ビット(01001011)が最下位ビット(10010110)に移動する - 変数 r に代入される(rbyte >> 1) ∨ (rbyte << 7)がどのような処理を考えてみると、rbyte >> 1は変数 rbyte を1ビット右にシフトするので先頭ビットが0のビット列、rbyte << 7は変数 rbyte を7ビット左にシフトするので、従前の最下位ビットが先頭ビットの値であり、それ以外が0のビット列となります。この2つのビット列の論理和をとると、ビット列全体を1ビット右にずらして空いた(0埋めされた)先頭ビットの位置に、従前の最下位ビットが入ることになります。01001011 >> 1 OR 01001011 << 7これを8回繰り返しても、終了時の変数 r は元の引数 byte と同じビット列になるだけなので不適切です。
=00100101 OR 10000000
=10100101
//rbyte の最下位ビット(01001011)が先頭ビット(10100101)に移動する
rbyte ← 01001011、r ← 00000000
- r ← 00000000 OR 00000001 = 00000001
rbyte ← 00100101 - r ← 00000010 OR 00000001 = 00000011
rbyte ← 00010010 - r ← 00000110 OR 00000000 = 00000110
rbyte ← 00001001 - r ← 00001100 OR 00000001 = 00001101
rbyte ← 00000100 - r ← 00011010 OR 00000000 = 00011010
rbyte ← 00000010 - r ← 00110100 OR 00000000 = 00110100
rbyte ←00000001 - r ← 01101000 OR 00000001 = 01101001
rbyte ← 00000000 - r ← 11010010 OR 00000000 = 11010010
rbyte ← 00000000
広告