偶数パリティとは?仕組み・用途・実装・限界を徹底解説
序論:偶数パリティの重要性
システム間でデータをやり取りするとき、伝送や記憶の過程でビットが反転する誤りが発生する可能性があります。偶数パリティ(even parity)は、こうした単純な誤り検出のために広く用いられてきた基本的かつ軽量な手法です。本稿では、数学的な定義、実務での使い方、実装例、利点と限界、そして他の検査手法との比較までを詳しく解説します。
偶数パリティの定義と基本原理
偶数パリティは、あるデータビット列に1ビットのパリティビットを付加して、データ全体(データビット+パリティビット)中の1の個数が偶数になるようにする方式です。すなわち、元のデータの1の個数が偶数であればパリティビットは0、奇数であればパリティビットは1になります。
この仕組みにより、ビット反転が1ビットだけ起こった場合は全体の1の個数の偶奇が変わるため、受信側でパリティを再計算して不整合を検出できます。
計算例
例を挙げます。データビットが「1011001」であったとします。
- 1の個数 = 4(偶数)
- 偶数パリティにするにはパリティビット = 0
- 送信されるビット列 = 1011001 0
別の例:データ「0110101」では1の個数 = 4(偶数) → パリティ0。データ「1101」では1の個数 = 3(奇数) → パリティ1が付加され送信列は11011になります。
検出できる誤りと検出できない誤り
- 検出できるもの:ビットが奇数個反転する誤り(代表例は単一ビット誤り)。
- 検出できないもの:ビットが偶数個(2ビット、4ビットなど)反転する誤り。複数ビットが同時に反転すると全体の1の偶奇が変わらないケースではパリティチェックをすり抜けます。
つまり、偶数パリティは「誤りの検出能力はあるが、訂正能力はない」手法です。誤りが検出されたら再送や上位プロトコルでの処理が必要になります。
用途と実例
- シリアル通信(UARTなど):フレームごとに1ビットのパリティを付けることが一般的。受信側はパリティ一致を確認して受理するか再要求を行う。
- 古典的なテレタイプ・端末:7ビットASCIIにパリティビットを付加して8ビットで伝送する運用が長く行われてきました。
- 簡易的なメモリ:パリティメモリはデータごとに1ビットのパリティを保持し、単一ビット誤りを検出するために使われます(ただし訂正はできません)。
- RAIDの概念的整合性:RAID 4/5などではブロック単位でのXORパリティを用いてドライブ障害時にデータを再構築します。ここでの「パリティ」はビット毎のXORに基づくもので、偶数パリティの考え方と数学的に近い性質を持ちます(奇数個の壊れたビットなどは復元できない点は類似)。
実装方法(アルゴリズム)
基本アルゴリズムは単純です。データのビットごとの排他的論理和(XOR)を計算し、その結果が1であればパリティビットを1、0であれば0にします。擬似コードは次の通りです。
- parity = 0
- for each bit b in data: parity = parity XOR b
- (上のparityが0なら偶数、1なら奇数。偶数パリティを作るにはパリティビット = parity)
多くのCPUや言語ではビットごとのXORやポップカウント(popcount)命令を用いて高速に計算できます。例えば、ポップカウント結果の偶奇判定は popcount(data) & 1 で得られます。
ハードウェア/ソフトウェアでの実装例
ハードウェアでは、送信回路がデータバイトの全ビットをXORし、パリティ出力ピンを設定します。受信側は逆に受け取ったデータとパリティビットのXORを行い、結果が0でなければエラーと判断します。
ソフトウェアでは、割込みハンドラやプロトコルスタック内でパリティチェックを実施し、エラーがあれば再送要求(ARQ)やパケット破棄などの処理を行います。
偶数パリティと奇数パリティの違い
奇数パリティ(odd parity)は総ビット数中の1の個数を奇数にする方式です。偶数パリティと奇数パリティは検出能力に差はなく、どちらを採用するかは規格や互換性の要件によります。通信相手と事前にどちらを使うか合意しておく必要があります。
利点と限界
- 利点
- 実装が非常に簡単で計算負荷が低い(1ビットのオーバーヘッド)。
- 単一ビット誤りや奇数個の誤りを即座に検出できる。
- 限界
- 誤り訂正能力がない(検出後は再送や上位対策が必要)。
- 偶数個のビット誤りを検出できないため、信頼性の高い環境では不十分。
- 現代のストレージやネットワークではCRCやハッシュ、ECCなどより強力な手法が好まれる。
偶数パリティと他の誤り検出・訂正方式の比較
- チェックサム:データブロック全体に対する和をとる方式。パリティより強力だが、簡単な改ざんや特定の誤りは見落とす場合がある。
- CRC(巡回冗長検査):多項式演算を使った高信頼の誤り検出法。バーストエラーや複数ビット誤りに強い。
- ECC(例:Hamming符号、SECDED):誤り検出だけでなく訂正も可能。メモリ用途で単一ビット訂正・二重ビット検出(SECDED)などが使われる。
要約すると、偶数パリティは軽量で安価だが、信頼性や訂正力が必要な場合はCRCやECCに置き換えるべきです。
実務的な運用上の注意点
- プロトコル間で偶数パリティか奇数パリティかを合わせること。
- パリティが検出したエラーに対してどのように対処するか(再送、ログ記録、中断など)を運用ルールとして定めること。
- 現代の高信頼化要求(RAID、分散ストレージ、暗号化など)ではパリティ単独では不十分なので、上位層での整合性検証(ハッシュ、CRC)やECCの採用を検討すること。
まとめ
偶数パリティは、単一ビット誤りやその他の奇数個ビット誤りを検出するための非常にシンプルで効率的な手法です。低帯域・低コストでのエラー検出に適していますが、訂正能力がなく偶数個のビット誤りを検出できないという根本的な限界があります。用途に応じてCRCやECCなどのより強力な手法と組み合わせて用いるのが実務上の定石です。
参考文献
Cyclic redundancy check (CRC) - Wikipedia


