ヌル
パリティビット

パリティビット

2023年3月3日

バイナリ通信におけるエラーとは、受信したメッセージが送信しようとしたメッセージと異なる状況を指します。これは、信号の完全性の低下、ノイズ、システムの故障など、さまざまな理由で発生する可能性があります。こうしたエラーは、メッセージの誤った解釈につながり、デジタル信号通信の正確性や信頼性に影響を及ぼす可能性があります。バイナリ通信のエラーを低減するための解決策の一つとして、パリティビットの使用が挙げられます。

ノイズによって引き起こされるデータ伝送エラーの例。


パリティビットとは何ですか?

パリティビット(パリティチェックとも呼ばれる)とは、データ伝送中の誤り検出を目的として、一連の2進データビットに追加される余分なビットのことです。パリティビットは、データ文字列に含まれる「1」の数が偶数か奇数かをチェックするために使用され、その結果、偶数パリティビットと奇数パリティビットの2種類があります。

バイナリエラー

バイナリ通信におけるエラーは、1が予期せず0に変わったり、その逆の現象が発生したりしたときに発生します。

詳細はこちらシリアルデータ通信規格 RS232

偶数パリティ

偶数パリティ方式では、パリティビットを含めた「1」のビットの総数が偶数になるよう、パリティビットが1または0に設定されます。

偶数パリティの計算方法

データ文字列内の「1」の数が奇数の場合、パリティビットは「1」に設定され、パリティビットを含めた「1」の総数が偶数になるようにします。データ文字列内の「1」の数がすでに偶数である場合は、パリティビットは「0」に設定されます。

奇数パリティ

奇数パリティ方式では、パリティビットを含めた1ビットの総数が奇数になるように、パリティビットを1または0に設定します。

奇数パリティの計算方法

データ文字列内の「1」の数が偶数の場合、パリティビットは「1」に設定され、パリティビットを含めた「1」の総数が奇数になるようにします。データ文字列内の「1」の数がすでに奇数である場合は、パリティビットは「0」に設定されます。

パリティビットの例

7ビットのデータ文字列 1ビットの数 パリティビットを含む8ビット
偶数パリティ 奇数パリティ
0000000 0 00000000 00000001
1100001 3 11000011 11000010
1100101 4 11001010 11001011
1111111 7 11111111 11111110

パリティビットのチェックは、ASCII文字の伝送で一般的に用いられます。この場合、8ビット目のビットがパリティビットとして予約され、残りの7ビットが文字の符号化に使用されます。


パリティビットの仕組み

データを送信する前に、送信側と受信側の双方が、奇数パリティか偶数パリティかを合意しておく必要があります。 各データパケット(ビット列)を送信する前に、送信側はパリティビット(0 または 1)を計算し、それが合意されたパリティ(奇数または偶数)と一致することを確認します。受信側では、受信したデータのパリティと期待されるパリティを照合します。これらが一致しない場合はエラーであることを示しており、そのデータは破棄するか、再送信を要求して訂正することができます。

パリティビットはエラーの検出にのみ使用されますが、どのビットが破損しているかを特定できないため、エラーを訂正する機能はありません。したがって、エラーを修正する唯一の方法は、データ文字列全体を破棄し、送信者に再送信を依頼することです。

パリティビットの位置

パリティビットの位置について決まった規則はありませんが、慣例として、バイナリ文字列のメッセージの末尾に追加されることが一般的です。


エラー検出

受信側でのパリティチェックでは、受信した信号のパリティと期待されるパリティを比較することで、エラーを検出することができます。不一致があった場合、受信側は送信側に対して再送信を要求することができます。

2進データ文字列に含まれる「1」の数が偶数か奇数かを判定するには、剰余演算子を使用します。剰余演算(mod)とは、ある整数を別の整数で割ったときの余りを求める数学的な演算です。剰余演算は記号「%」で表されます。

剰余(モジュロ)を用いると、ある数が2で割り切れるかどうかによって、その数が偶数かどうかを判断できます。一方、2で割ったときに余りが残る数は、奇数とみなされます。

以下のC言語のプログラム例は、剰余演算を用いたパリティチェックのプロセスを示しています。

#include 
int main() {
    unsigned char byte;
    int num_ones = 0;
    printf("Enter a byte (in decimal): ");
    scanf("%hhu", &byte);
    // Count the number of 1s in the byte
    for (int i = 0; i < 8; i++) {
        if ((byte >> i) & 1) {
            num_ones++;
        }
    }
    // Detect parity with mod 2 and print the parity type. 
    if (num_ones % 2 == 0) { //
        printf("Even parity\n");
    } else {
        printf("Odd parity\n");
    }
    return 0;
}

このプログラムは、まずユーザーから1バイトの入力を受け取ります。次に、ループを使用して、そのバイトに含まれる「1」のビット数を数えます。具体的には、バイトをビット位置ごとに(0から7まで)右へシフトし、その結果のビットが「1」かどうかを確認します。「1」であれば、「1」のビット数を1増やします。最後に、プログラムは「1」のビット数が偶数か奇数かを判定し、それに応じたメッセージを出力します。

なお、このプログラムでは、バイト値を格納するために unsigned char を使用しています。これは 8 ビットの整数型であり、0 から 255 までの値を格納できます。scanf() では、%hhu というフォーマット指定子を使用して、ユーザーからバイト値を読み取ります。


パリティビットの追加方法

データ文字列「1100101」を送信する必要がある例を見てみましょう。まず、データ文字列に含まれる「1」の数を数え、2を割り数とする剰余演算子を用いて、その数が偶数か奇数かを判定します:

1100101
(1+1+0+0+1+0+1) mod 2
4 mod 2 = 0

4を2で割ると余りが生じないため、結果は0となり、1の個数が偶数であることを示しています。偶数パリティに合意している場合は、パリティビットとして「0」をメッセージの末尾に追加し、その結果「11001010」となり、これで送信可能になります。 一方、奇数パリティに合意している場合は、パリティビットを反転させて代わりに「1」を追加し、その結果、送信可能な最終メッセージは「11001011」となります。


パリティビットの用途

  • エラー検出:パリティビットの主な用途の一つは、データ伝送中のエラーを検出することです。
  • メモリの保存:パリティビットは、コンピュータメモリシステムにおいても、データがメモリに保存される際のエラーを検出するために使用されます。データがメモリに保存される際、電磁干渉やハードウェアの故障など、さまざまな要因によってエラーが発生するリスクが常に存在します。
  • RAIDシステム:パリティビットは、RAID(Redundant Array of Inexpensive Disks)でも使用されます。RAIDは、「Redundant Array of Independent Drives」とも呼ばれます。RAIDシステムは、複数のディスクを使用してデータを冗長的に保存し、ディスクの故障からデータを保護します。フォールトトレランスを実現するためにパリティが使用されます。

詳細はこちら: EMI(電磁干渉)


結論

結論として、パリティビットは、ストレージやデータ伝送の正確性を確保するのに役立つ、シンプルでありながら効果的な誤り検出機構である。パリティビットは絶対的なものではなく、一部の誤りしか検出できないものの、バイナリデータ通信における多くの用途において依然として有用である。