解決済み
基本情報技術者試験におけるアルゴリズムの前提 以下の問題は公式が出してる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 解答はアですが、それ以前に問題文で 8 ビット型: r ← 00000000 これはrの初期値と理解できます。 8 ビット型: rbyte ← byte rbyteの初期値?rの説明が既にあり、解説にも使わないけどなにに必要? 整数型: i for (i を 1 から 8 まで 1 ずつ増やす) 解説を見ると、このiが関数revのi桁目を意味するのは分かるのですが、問題文には一切説明がないように思えます。 私の読解力不足だとは思うのですが、問題を解く上で前提知識が欠けているのでしょうか?
367閲覧
>このiが関数revのi桁目を意味するのは分かるのですが ここが誤解です。 iは何桁目を意味するのではなく、for文を8回(8ビット)繰り返すための、ただのカウンタです。
なるほど:1
そうですね。 「説明のないものについては、それを考察することもまた問題の一部である。」という前提を持つべきですね。 変数iは「i桁目」を指すためのものではありません。 解答がアだというのなら「このプログラムは最下位ビットしかチェックしない」ということです。チェックする桁を固定する代わりに、論理シフトで「次のターゲット」をその桁へ移動させているのですよ。変数iは何回シフトしたかを数える「ループカウンタ」です。
> 8 ビット型: rbyte ← byte > rbyteの初期値?rの説明が既にあり、解説にも使わないけどなにに必要? はい。rbyteの初期値として引数で渡された変数byteの値を代入しています。 解説には無いですが回答候補にはrbyteの処理が書いてありますのでrbyteをどのように処理しているかは分かりますよね。 >整数型: i > for (i を 1 から 8 まで 1 ずつ増やす) > 解説を見ると、このiが関数revのi桁目を意味するのは分かるのですが、 > 問題文には一切説明がないように思えます。 設問「8 ビット型の引数 byte を受け取り,ビットの並びを逆にした値を返す。」「for (i を 1 から 8 まで 1 ずつ増やす)」 と書いてあるので、引数byteのビットの左側 or 右側から順に1ビットづつ処理するのだということが読み取れます。 あとは回答候補を見てどうやって1ビットづつ反転しようとしているかを考えれば答えが分かると思います。 P.S. この問題に限って言えば、for文で1〜8を回しているのだから1ビットづつ反転するんだと言うことがすぐに分かります。であるならば、回答候補に「>> 7」や「<< 7」というキーワードが入っていたら間違いだとすぐに判断できます。7ビットもシフトしたら元データが消えてしまいますから。 そうすると速攻で「ア」だと分かります。
問題文にはプログラムの仕様の説明があるだけでプログラムの説明はない。よってfor (i を 1 から 8 まで 1 ずつ増やす)についても説明がない
< 質問に関する求人 >
基本情報技術(東京都)この条件の求人をもっと見る
求人の検索結果を見る
< いつもと違うしごとも見てみませんか? >
覆面調査に関する求人(東京都)この条件の求人をもっと見る