B科目 ビット系の問題について
とろさん
(No.1)
問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問5分程度で解くことはできないと思います。皆さんはどのように解かれますか?
関数 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問5分程度で解くことはできないと思います。皆さんはどのように解かれますか?
2025.05.17 13:33
rimyueruさん
(No.2)
仰る通り、時間内で選択肢全てをトレースして解くのは無理です。ぱっと見ですぐに選択肢が搾れるケースもありますが、間違った選択肢は大体1.2回for文回した辺りでその桁には入るはずがない値が出てきたりすることが多いのでそれで判断できます。
2025.05.17 13:42
とろさん
(No.3)
やはり、そうですよね。ありがとうございます!
2025.05.17 13:43
jjon-comさん
★FE プラチナマイスター
(No.4)
基本情報 サンプル問題 科目B 問6
https://www.fe-siken.com/kakomon/sample/b6.html
私はこの問題を次のように解きました。
ABCDEFGH と横に並んだ8人の並びを、
処理を8回繰り返して HGFEDCBA にするのですから、
(1) 右端に着目し、H→G→F→… の順に人を取り出しつつ、別の場所に左から並べていく。
(2) 左端に着目し、A→B→C→… の順に人を取り出しつつ、別の場所に右から並べていく。
のどちらかだろうと予想をつけます。
選択肢のアとイを見ると、
`(rbyte 論理積 00000001)` つまり 最右端の1bitを抽出している命令がありますから、
これはどちらも上記の(1)の立場だと分かります。
アの`(rbyte ← rbyte >> 1)`は、最右端の1bitを抽出した後、右1bitシフトする。
これを繰り返していますから、右端から一人ずつ取り出すイメージに合致します。
それに対してイは、一気に7bitもシフトしており一人ずつ取り出せません。
この時点で、正解はアだろうと予想しました。
選択肢ウは、1回目の繰り返しで、
`(rbyte << 1)` 左1bitシフト、つまり BCDEFGH- と
`(rbyte >> 7)` 右7bitシフト、つまり ーーーーーーーA を
併合して、新たに BCDEFGHA にしています。
2回目の繰り返しで、
`(rbyte << 1)` 左1bitシフト、つまり CDEFGHA- と
`(rbyte >> 7)` 右7bitシフト、つまり ーーーーーーーB を
併合して、CDEFGHAB にしています。
この2回目の時点で「ウは、8人の並びは逆にならない」と判断しました。
選択肢エは、1回目の繰り返しで、
`(rbyte >> 1)` 右1bitシフト、つまり -ABCDEFG と
`(rbyte << 7)` 左7bitシフト、つまり Hーーーーーーー を
併合して、新たに HABCDEFG にしています。
2回目の繰り返しで、
`(rbyte >> 1)` 右1bitシフト、つまり -HABCDEF と
`(rbyte << 7)` 左7bitシフト、つまり Gーーーーーーー を
併合して、新たに GHABCDEF にしています。
この2回目の時点で「エも、8人の並びは逆にならない」と判断しました。
https://www.fe-siken.com/kakomon/sample/b6.html
私はこの問題を次のように解きました。
8ビット型の引数 byte を受け取り,ビットの並びを逆にした値を返す。
for (i を 1 から 8 まで 1 ずつ増やす)
比喩でイメージするなら、for (i を 1 から 8 まで 1 ずつ増やす)
ABCDEFGH と横に並んだ8人の並びを、
処理を8回繰り返して HGFEDCBA にするのですから、
(1) 右端に着目し、H→G→F→… の順に人を取り出しつつ、別の場所に左から並べていく。
(2) 左端に着目し、A→B→C→… の順に人を取り出しつつ、別の場所に右から並べていく。
のどちらかだろうと予想をつけます。
選択肢のアとイを見ると、
`(rbyte 論理積 00000001)` つまり 最右端の1bitを抽出している命令がありますから、
これはどちらも上記の(1)の立場だと分かります。
アの`(rbyte ← rbyte >> 1)`は、最右端の1bitを抽出した後、右1bitシフトする。
これを繰り返していますから、右端から一人ずつ取り出すイメージに合致します。
それに対してイは、一気に7bitもシフトしており一人ずつ取り出せません。
この時点で、正解はアだろうと予想しました。
選択肢ウは、1回目の繰り返しで、
`(rbyte << 1)` 左1bitシフト、つまり BCDEFGH- と
`(rbyte >> 7)` 右7bitシフト、つまり ーーーーーーーA を
併合して、新たに BCDEFGHA にしています。
2回目の繰り返しで、
`(rbyte << 1)` 左1bitシフト、つまり CDEFGHA- と
`(rbyte >> 7)` 右7bitシフト、つまり ーーーーーーーB を
併合して、CDEFGHAB にしています。
この2回目の時点で「ウは、8人の並びは逆にならない」と判断しました。
選択肢エは、1回目の繰り返しで、
`(rbyte >> 1)` 右1bitシフト、つまり -ABCDEFG と
`(rbyte << 7)` 左7bitシフト、つまり Hーーーーーーー を
併合して、新たに HABCDEFG にしています。
2回目の繰り返しで、
`(rbyte >> 1)` 右1bitシフト、つまり -HABCDEF と
`(rbyte << 7)` 左7bitシフト、つまり Gーーーーーーー を
併合して、新たに GHABCDEF にしています。
この2回目の時点で「エも、8人の並びは逆にならない」と判断しました。
2025.05.17 17:16
とろさん
(No.5)
jjon-comさん
そのような発想ができるなんて凄すぎます!ただイメージで考えるととても分かりやすく納得できました。同じ問題は出ないにしても考え方として参考にさせていただきます。
ありがとうございます。
そのような発想ができるなんて凄すぎます!ただイメージで考えるととても分かりやすく納得できました。同じ問題は出ないにしても考え方として参考にさせていただきます。
ありがとうございます。
2025.05.17 18:17
広告
返信投稿用フォーム
スパム防止のためにスレッド作成日から40日経過したスレッドへの投稿はできません。
広告