わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

合計を答えてください

いきなりですがアンケートです.

これまでの配付資料をどのように利用していますか?以下に該当する数値の合計を回答してください.
1. 復習時に読み直している.
2. 小テストで(前回のを)参照している.
4. 授業中に書き込んでいる.
8. クリアファイルなどに入れ,すぐ取り出せるようにしている.
16. 他の科目の授業中にも参照している.
32. 教科書を読めば十分なので,利用していない.
64. Webの授業資料を見ればいいので,あまり読んでいない.
128. 試験に持ち込めないので,当てにしていない.

月曜日の授業で,答えてもらいました.
授業の最初に小テストかアンケートを実施していて,小テストは,前の授業の復習が3問,教科書の内容に基づくのが1問,を標準としています.なのですが今週の月曜の小テスト・アンケートでは,教科書の出題範囲(自習範囲)を指示するのを忘れていました.他の問題を解答してもらう代わりに,これまで初回から5回,資料を配布しているのでその感想を聞こうと,変化球を投げたのでした.
数値が倍々になっていることから,2進数として表記し,それを10進数に変換した回答がありました.それはそれで,選択ミスを減らすのにはつながるのですが,計算ミスを減らせるとは限りません.「合計」を求めるという点では,実質的に同じ作業をしているからです.
このアンケートのポイントとなるのは,一つの整数値から,上の8個の質問のどれを選択しどれを選択しなかったかが分かるようになっている,ということです.どうやってかというと,以下その整数値をxとおき,C言語の記法を用いると,

  • x & 1 が0でなければ,「復習時に読み直している.」を選択しており,0ならば選択していない.
  • x & 2 が0でなければ,「小テストで(前回のを)参照している.」を選択しており,0ならば選択していない.
  • x & 4 が0でなければ,「授業中に書き込んでいる.」を選択しており,0ならば選択していない.
  • x & 8 が0でなければ,「クリアファイルなどに入れ,すぐ取り出せるようにしている.」を選択しており,0ならば選択していない.
  • x & 16 が0でなければ,「他の科目の授業中にも参照している.」を選択しており,0ならば選択していない.
  • x & 32 が0でなければ,「教科書を読めば十分なので,利用していない.」を選択しており,0ならば選択していない.
  • x & 64 が0でなければ,「Webの授業資料を見ればいいので,あまり読んでいない.」を選択しており,0ならば選択していない.
  • x & 128 が0でなければ,「試験に持ち込めないので,当てにしていない.」を選択しており,0ならば選択していない.

ということです.これは第4回授業で解説した,unsigned char型の数値のビットパターン(2進表記)を出力するプログラムと同様に,ループで処理できます.
さらに,32,64,128の項目については,そこのいずれか一つ以上に該当するという回答があれば,その学生にとっては配布資料の価値が重要でない(授業実施者の期待に沿っていない)という意味になります.これを判定するのは

  • x & (32 | 64 | 128) が0でないこと

です.「いずれか一つ以上に該当」は,授業で説明したOR条件ですが,これを「すべてに該当」という,AND条件に変えたければ

  • (x & (32 | 64 | 128)) == (32 | 64 | 128)

とします.演算子の優先順位に注意すると,いずれのカッコも不可欠です.
「|」は,ビット単位で論理和を計算する演算子です.32,64,128は,それぞれ2進数で表したとき,ビットの位置が重なっていません.なので「32 | 64 | 128」と「32 + 64 + 128」は,値(評価の結果)としては同じになります.
とはいえ,演算子の優先順位には注意しないといけません.加減算>比較>ビット ですので,「x & 32 + 64 + 128」「(x & 32 + 64 + 128) == 32 + 64 + 128」は一応等価な式ですが,紛らわしくてこのようには書きません*1.そもそもここは,ビット演算で算出することが自然なので,「+」ではなく「|」を使用しているのです.
冒頭のアンケート文では逆に,問いの文章の書きやすさ,学生の作業のしやすさから,「合計」すなわち + 演算子の適用を促しています.これを「以下に該当する各数値に対して,| 演算子で計算して得られる値を回答してください」とすると,アンケートという名のパズルになってしまいます.
補足:

  • まずい文になるほど,数値を大きくしています.それを選択して,合計を求めるとなると計算ミスが起こりやすくなりますので,そういった選択を少しでも抑止しようという意図がありました.適切なアンケートをするには,こういったバイアスを取り除いた配列にする必要が,ありますね.
  • 「16. 他の科目の授業中にも参照している.」を選択している学生がいる分には,そういう調査ですから文句は言えないのですが,この文を肯定的に捉え,「他の科目でも参照していいんだ」と思った学生がいたりしたら,まずいのでした.他の科目の先生も,学生に最もよく理解してもらえる方法を苦心して,準備し授業をされているわけで,そこに水をさすことになります.

*1:そもそも単一の項目にせよ「32 | 64 | 128」という項目にせよ,#defineでマクロ定義して,定数で参照するのが,Cらしい書き方と言えるでしょう.