ビット列に検査用ビットを付加して1ビット誤りを検出する方式
パリティチェックとは、データのビット列に パリティビット(=誤りを調べるための1ビットの検査用ビット) を1つ付け加えて送り、受信側で誤りがないかを確かめる仕組みのことです。最もシンプルな誤り検出方式で、メモリやシリアル通信など身近な場所で使われています。
身近な例で考えると、レジでお釣りの硬貨の枚数を「奇数枚のはず」と決めておくようなものです。受け取った硬貨が偶数枚なら「あれ、1枚多いか少ないぞ」と気づけます。パリティチェックも同じで、「1の個数を必ず偶数(または奇数)にする」という約束を作り、その約束が崩れていたら誤りがあったと判断します。
上のツールでデータビットをクリックして変えると、付加されるパリティビット(P)が自動で計算されます。「誤り注入」でビットを反転させると、受信側がそれをどう判定するか(検出できる/できない)が一目で分かります。
パリティには2つの流儀があり、「全体の1の個数をどちらの偶奇に揃えるか」だけが違います。
・偶数パリティ:データ+パリティの1の個数が 偶数 になるようパリティビットを決める
・奇数パリティ:データ+パリティの1の個数が 奇数 になるようパリティビットを決める
例えばデータ 1011001 は1が4個(偶数)です。偶数パリティなら、すでに偶数なのでパリティビットは 0。奇数パリティなら、奇数にするためパリティビットは 1 になります。送信側と受信側が同じ流儀を使っていることが前提で、これがズレると正しく判定できません。
誤り検出の能力はどちらも同じです。違いは「データがすべて0のとき」で、偶数パリティではパリティも0(全0が正常)になるのに対し、奇数パリティでは必ずどこかに1が立つため、全ビットが0という異常(断線などで信号が来ない状態)も検出しやすいという利点があります。
パリティチェックの仕組みは「1の個数の偶奇」だけを見ています。そのため検出できる誤りには限界があります。
・奇数個(1, 3, 5…個)の誤り:偶奇がひっくり返るので 検出できる
・偶数個(2, 4…個)の誤り:偶奇が元どおりに戻るので 検出できない
・誤りの「場所」:どのビットが誤ったかは特定できない(検出のみで訂正はできない)
具体例で確かめましょう。偶数パリティで 10110010(1が4個)を送ったとします。1ビット反転して 10010010 になると1が3個=奇数になり、「偶数のはずが奇数だ」と気づけます。しかし2ビット反転して 10010110 になると1が4個に戻るため、受信側は誤りに気づけません。上のツールで「誤り注入」を2つ選ぶと、この見逃しを体験できます。
ポイントは 「パリティは1ビット誤りの検出はできるが訂正はできない、偶数ビットの誤りは検出できない」 という点です。より強い誤り検出が必要な場合は、後続の CRC(巡回冗長検査) や、誤りの訂正までできる ハミング符号 を使います。
結論から言うと、2つのビットが同時に誤ると「1の個数の偶奇」が元に戻ってしまうからです。
仕組みを順を追って考えましょう。
・送信時:データ 1011001 + パリティ 0 → 1の数は4個(偶数)
・1ビット誤り:偶数→奇数 に変わる → 受信側が「奇数になった!」と気づける
・2ビット誤り:偶数→奇数→偶数 と2回変わる → 元の偶数に戻ってしまう → 気づけない
身近な例えで考えると、コインを1枚裏返すと表・裏が変わるが、2枚同時に裏返すと元に戻るのと同じです。パリティは「表か裏か(偶奇)」しか見ていないため、偶数枚ひっくり返しても変化が検出できません。これがパリティの本質的な限界です。奇数個(1、3、5…)の誤りは必ず偶奇を変えるので検出できますが、偶数個(2、4…)は見逃します。
2次元パリティ(=縦と横の両方向にパリティを付ける方式)を使うと、1ビットのパリティでは見逃してしまう誤りも多く検出・特定できるようになります。
仕組みはシンプルです。
・行パリティ:各行のデータの偶奇を合わせる検査ビットを右端に付ける
・列パリティ:各列のデータの偶奇を合わせる検査ビットを下端に付ける
・1ビット誤りが起きるとその行の行パリティと、その列の列パリティの両方が崩れる→ 行と列の交差点が誤りの位置!
身近な例えは「縦横の数独(ナンプレ)の検算」です。縦の合計と横の合計の両方でおかしい行・列が交わる場所が間違いの場所です。2次元パリティは1次元より多くの冗長ビットが必要ですが、1ビット誤りなら位置まで特定して訂正できる可能性があります。ただし2ビット以上の誤りは相変わらず見逃すこともあるため、より強力な誤り制御にはCRCやハミング符号が使われます。