第46問 通信のエラーを見つける(パリティチェック)
届いた8ビットのデータ bit(=[1,0,1,1,0,1,0,1])は、はじめの7ビットが本当のデータで、最後の bit[7] は「パリティビット」です。偶数パリティでは、はじめの7ビットにふくまれる1の個数が偶数なら0、奇数なら1をパリティビットにします。7ビットから正しいパリティビットを計算し、届いた bit[7] と同じかどうかで「正常」か「エラー」かを表示しよう。あてはまる記号を選ぼう(3か所の穴をうめよう)
難易度:★★★★☆(4/やや難しい)。単元:条件分岐・繰り返し・配列。共通テスト「情報I」で使われるDNCL(共通テスト用プログラム表記)の穴埋め問題です。JavaScriptを有効にすると、このページでプログラムを組み立てて実行しながら解けます。
プログラム
bit = [1,0,1,1,0,1,0,1]
kosuu = 0
i を 0 から 6 まで 1 ずつ増やしながら繰り返す:
もし bit[i] [A] 1 ならば:
kosuu = kosuu [B] 1
parity = kosuu [C] 2
表示する("1の個数は" + kosuu + "個、計算したパリティビットは" + parity + "です")
もし parity == bit[7] ならば:
表示する("正常に届きました")
そうでなければ:
表示する("エラーが見つかりました")
空欄 [A]・[B]・[C] に当てはまるものを、次の選択肢から選びます。
選択肢
ヒント
パリティビットは「1の個数を偶数にそろえるためのおまけの1ビット」です。まず bit[i] == 1 になった回数を kosuu + 1 で数え、kosuu % 2 を計算すると、偶数なら0・奇数なら1になります。これが届いた bit[7] と食いちがっていれば、通信のとちゅうでビットが化けた(エラー)とわかります
解答
- 空欄 [A] …
==
- 空欄 [B] …
+
- 空欄 [C] …
%
よくある間違い
- [A]
!= [B]+ [C]% … != は「1ではないとき」、つまり0の個数を数えることになります。はじめの7ビットに0は3個なので kosuu は3、パリティは 3 % 2 = 1 となり、届いた bit[7] の1とたまたま一致して「正常」と表示されます。本当はエラーなのに見のがしてしまいます。1の個数を数えたいので == を使います
- [A]
> [B]+ [C]% … bit の中身は0か1しかないので、bit[i] > 1 になることは一度もありません。kosuu は0のままで、パリティも0のまま数えたことになりません。ちょうど1かどうかを調べる == にしましょう
- [A]
== [B]- [C]% … - だと1が見つかるたびに kosuu が1ずつ減って -4 になってしまいます。個数を数えるときは1ずつふやす + です
- [A]
== [B]* [C]% … kosuu は0から始まるので、何回かけても 0 * 1 = 0 のままです。1が4個あっても「0個」と数えたことになります。数えるのは + です
- [A]
== [B]+ [C]/ … / だと 4 / 2 = 2 となり、0か1しかないはずのパリティビットが2になってしまいます。知りたいのは「偶数か奇数か」なので、2でわったあまりを出す % を使います
- [A]
== [B]+ [C]* … * だと 4 * 2 = 8 となり、パリティビットが8という、ありえない値になります。0か1にするには 2 でわったあまりの % です
- [A]
!= [B]+ [C]/ … 2か所ちがいます。数えたいのは1の個数なので ==、偶数か奇数かは2でわったあまりを見る % で調べます
この単元の解説動画
ほかの問題