- パリティチェック再入門:「垂直」と「水平」の謎を解き明かす
- 「垂直」と「水平」のネーミングパズル:なぜ混乱するのか?
- 垂直パリティ(VRC - Vertical Redundancy Check)を理解する
- 水平パリティ(LRC - Longitudinal Redundancy Check)を理解する
- 名前の意味と概念を結びつける:ビジネスモデルの類推を再び
- まとめ:これでスッキリ!垂直・水平パリティ
パリティチェック再入門:「垂直」と「水平」の謎を解き明かす
データの送信や保存において、ノイズや予期せぬトラブルによってデータが破損してしまうことは避けられない課題です。せっかく送った情報が途中で変わってしまっては、正しいコミュニケーションや処理ができません。
このような問題に対処するため、古くから様々な技術が考案されてきました。その中でも、最も基本的で理解しやすい誤り検出技術の一つが「パリティチェック」です。
パリティチェックの基本的な考え方は非常にシンプルです。データの単位(例えば8ビットのデータ)に、余分な1ビット、すなわち「パリティビット」を付け加えます。
このパリティビットの値は、元のデータに含まれる「1」の数が常に偶数個(偶数パリティ)または常に奇数個(奇数パリティ)になるように調整されます。
データを受け取った側は、このルール(偶数か奇数か)が守られているかを確認することで、データが途中で変化した(エラーが発生した)可能性を検知できるのです。
これは、「パリティとは、誤り検出に用いられる技術の一種で、2進数で表現されたデータの0または1の数が偶数個あるか、あるいは奇数個あるかを比較することである」という基本的な定義そのものです。
このパリティチェックには、主に「垂直パリティ」と「水平パリティ」という二つの方式がありますが、この「垂直」「水平」という名前がしばしば混乱を招きます。
「垂直」と「水平」のネーミングパズル:なぜ混乱するのか?
多くの方が経験するように、「垂直パリティ」や「水平パリティ」という名前と、実際のデータの並び方やパリティビットの付加される位置が、直感的に一致しないことがあります。
例えば、
データ① 10101000 にパリティビット 1 を追加して 101010001 となったものを「垂直パリティ(の結果を含むデータ)」と説明されることがあります。しかし、これを見ると、データが横に並んでいて、パリティビットもその右端に「水平に」追加されているように見えます。「見た感じ『水平パリティ』っぽいじゃん」と感じるのも無理はありません。
一方で、「水平パリティ」は、次のような例で説明されることがあります。
100001000
010000111
010110010
---------
100111101 (← 水平パリティ)
この場合、複数のデータ(行)に対して、一番下の行にパリティビットの集まり(水平パリティ)が「水平に」並んでいます。しかし、別の説明では、データの各ビット位置(列)ごとに計算され、右端に「縦に」水平パリティが並んでいる図を見ることもあります。「右端に縦に水平パリティがついてるのも見たことあったような」という疑問も、もっともです。
この混乱の根本的な原因は、「垂直」「水平」という名前が、パリティビットが視覚的にどこに配置されるか(横に追加されるか、縦に追加されるか)を指しているのではなく、パリティを計算する際の「範囲」や「方向性」を示している点にあります。
なぜこのような名前になったのか、その正確な起源を特定するのは難しいですが、一つの有力な考え方として、初期のコンピュータでデータを扱う際のイメージに由来するというものがあります。
例えば、データをバイト単位(8ビットなど)で考え、それらをメモリや処理パイプラインの中で縦に積み重ねていくようなイメージです。
この場合、一つのバイト内部のビットに対してパリティを計算する操作は、その積み重なったビットの「縦方向」を見ることに相当します。これが「垂直パリティ」と呼ばれるようになったのかもしれません。
一方、複数のバイトにまたがって、同じ位置にあるビット(例えば、全バイトの3番目のビット)に対してパリティを計算する操作は、積み重なったバイトを「横断」する方向、つまり「水平方向」に見ることに相当します。これが「水平パリティ」の由来である可能性があります。
しかし、現代ではデータを図示する方法は様々であり、必ずしもこの初期のイメージ通りに描かれるわけではありません。そのため、名前と見た目のレイアウトが一致しないように感じられる場面が出てくるのです。
重要なのは、名前の由来の可能性を理解しつつ、それぞれのパリティがどのように計算され、何を対象としているかを正確に把握することです。これから、それぞれのパリティについて詳しく見ていきましょう。
垂直パリティ(VRC - Vertical Redundancy Check)を理解する
垂直パリティ(VRC)は、個々のデータ単位(例えば、1バイト、1文字、1ワードなど)それぞれ独立して計算されるパリティチェックです。他のデータ単位とは無関係に、その単位の中だけで完結します。
計算方法は単純です。対象となるデータ単位に含まれる「1」のビット数を数え、その合計が決められたルール(偶数または奇数)に合うようにパリティビット(0か1)を決定し、付加します。
この操作が「垂直」と呼ばれるのは、先ほどのイメージで言えば、一つのデータ単位を構成するビットが縦に並んでいると考えた場合、そのビットの並び(縦方向)に対してチェックを行うと解釈できるからです。データ単位がページ上で横に書かれていても、計算の対象はあくまでその単位「内部」のビット群であり、概念的には「垂直」方向のチェックと捉えられます。
ここで重要なのは、各VRCビットはその担当するデータ単位のことしか考慮しない「独立性」です。隣のデータ単位がどうであろうと、自分の担当範囲の「1」の数を数えてパリティビットを決めるだけです。
例:垂直パリティ(VRC)の計算
元のデータが8ビットで、偶数パリティ(「1」の合計数が偶数になるようにする)を用いる場合を考えます。
元のデータ (8ビット) |
「1」の数 |
VRCビット (偶数パリティ) |
データ + VRCビット |
10101000 |
3 (奇数) |
1 |
101010001 |
01110010 |
4 (偶数) |
0 |
011100100 |
11011011 |
6 (偶数) |
0 |
110110110 |
00000000 |
0 (偶数) |
0 |
000000000 |
ユーザーが例に挙げた 10101000 の場合、「1」が3つ(奇数)あります。もし偶数パリティを採用するなら、VRCビットは 1 となり、全体で 101010001 となります。もし奇数パリティなら、VRCビットは 0 となり、101010000 となります。
どちらのルール(偶数/奇数)を使うかは、システムやプロトコルによって事前に決められています。
このVRCは、かつて非同期シリアル通信(古いタイプのコンピュータ接続で使われたRS-232Cなど)で、1文字(1バイト)ごとにエラーがないかを確認するためによく利用されていました。各文字が独立して送受信されるような場面で、手軽なエラー検出手段として有効だったのです。
水平パリティ(LRC - Longitudinal Redundancy Check)を理解する
水平パリティ(LRC)は、垂直パリティとは異なり、複数のデータ単位(バイト、文字、ワードなど)を一つのブロックとして扱い、そのブロック全体にわたって計算されるパリティチェックです。
計算方法は少し異なります。ブロック内のすべてのデータ単位について、同じビット位置(例えば、全データ単位の1番目のビット、2番目のビット、…)ごとにパリティを計算します。
つまり、データの「列」方向に対してパリティを取るのです。この結果、各ビット位置のパリティを表すビットが集まった、新しいデータ単位(LRCブロックやブロックチェックキャラクタ(BCC)と呼ばれることもあります)が生成されます。
この操作が「水平」と呼ばれるのは、データのブロックが時間軸に沿って(あるいはデータの流れに沿って)「水平に」続いていると考えた場合、そのデータの流れ(水平方向、あるいはデータの長さに沿った方向 - Longitudinal)に沿って、対応するビット位置を横断的にチェックすると解釈できるからです。
重要なのは、LRCの各ビットは、ブロック内の複数のデータ単位に依存している「相互依存性」です。LRCを計算するためには、ブロック全体のデータが必要になります。
例:水平パリティ(LRC)の計算
ユーザーが提示した最初の3つのデータ単位(ここでは9ビットとします)からなるブロックがあり、各ビット位置で偶数パリティを用いる場合を考えます。
データ種別 |
ビット1 |
ビット2 |
ビット3 |
ビット4 |
ビット5 |
ビット6 |
ビット7 |
ビット8 |
ビット9 |
データ1 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
データ2 |
0 |
1 |
0 |
0 |
0 |
0 |
1 |
1 |
1 |
データ3 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
偶数パリティ |
1 |
0 |
0 |
1 |
1 |
1 |
1 |
0 |
1 |
偶数パリティの決め方=各列の '1' の数が偶数になるように計算
- 1列目: 1 + 0 + 0 = 1 (奇数) : LRCビットは 1
- 2列目: 0 + 1 + 1 = 2 (偶数) : LRCビットは 0
- 3列目: 0 + 0 + 0 = 0 (偶数) :LRCビットは 0
- 4列目: 0 + 0 + 1 = 1 (奇数) : LRCビットは 1
- 5列目: 0 + 0 + 1 = 1 (奇数) : LRCビットは 1
- 6列目: 1 + 0 + 0 = 1 (奇数) : LRCビットは 1
- 7列目: 0 + 1 + 0 = 1 (奇数) : LRCビットは 1
- 8列目: 0 + 1 + 1 = 2 (偶数) : LRCビットは 0
- 9列目: 0 + 1 + 0 = 1 (奇数) : LRCビットは 1
重要なのは計算の「やり方」です。
LRCは、データのブロックを縦(列)方向に見て、各列ごとにパリティを計算するということです。
そして、「右端に縦に水平パリティがついてる」ケースについてです。これは、元のデータの並べ方が違うだけです。もし、各データ単位(バイトなど)を縦に書き、それを横に並べてブロックを構成した場合、
ビット位置 |
データ1 |
データ2 |
データ3 |
偶数パリティ |
ビット1 |
1 |
0 |
0 |
1 |
ビット2 |
0 |
1 |
1 |
0 |
ビット3 |
0 |
0 |
0 |
0 |
ビット4 |
0 |
0 |
1 |
1 |
ビット5 |
0 |
0 |
1 |
1 |
ビット6 |
1 |
0 |
0 |
1 |
ビット7 |
0 |
1 |
0 |
1 |
ビット8 |
0 |
1 |
1 |
0 |
ビット9 |
0 |
1 |
0 |
1 |
このように、LRCは右端に「縦に」並ぶことになります。これは、参照されていた oshiete.goo.ne.jp のリンク先で説明されていたAパターン(データが縦書き)とBパターン(データが横書き)の違いに対応します。
データの書き方が変わっても、LRCが「複数のデータ単位にまたがって、対応するビット位置ごとに計算される」という本質は変わりません。
LRCは、VRCが個々のデータ単位のエラーしか検出できないのに対し、データブロック全体に対するチェックを提供します。テープ記録など、ある程度の長さのデータブロックを扱う場合に用いられることがありました。
名前の意味と概念を結びつける:ビジネスモデルの類推を再び
ここで、垂直パリティ(VRC)と水平パリティ(LRC)の核心的な違いを再確認しましょう。
- VRC(垂直パリティ): **個々のデータ単位の「内部」**で完結するチェック。計算は他の単位から独立している。
- LRC(水平パリティ): **複数のデータ単位を「横断」**して、対応するビット位置ごとに行うチェック。計算はブロック内の全単位に依存する。
この関係性を理解する上で、ユーザーが見つけたビジネスモデルの類推は非常に的確です。「垂直統合型のビジネスモデルとか水平分業型のビジネスモデルとか言うじゃないですか。アレですね。」という指摘は、本質を捉えています。
- **垂直統合(Vertical Integration)**は、一つの企業が製品の企画開発から製造、販売までのバリューチェーン全体を自社内で完結させようとする戦略です。これは、VRCが一つのデータ単位の内部(ビットの並び)だけで完結している点に似ています。スコープが「内部」に向かっています。
- **水平分業/連携(Horizontal Division/Cooperation)**は、複数の企業がそれぞれの得意分野(例えば、部品製造、組み立て、販売など)を担当し、互いに連携して一つの製品やサービスを提供するモデルです。これは、LRCが複数のデータ単位にまたがり、それぞれの対応する部分(同じビット位置)を連携させて(まとめて計算して)チェックする点に似ています。スコープが「横断的」です。
「独立パリティとか従属パリティとかの方がわかりやすいと思うんだけど。」という提案も、概念的には理解しやすいかもしれません。VRCは各データ単位ごとに独立して計算され、LRCはブロック内のデータ全体に従属して計算される、と。しかし、残念ながら技術の世界では「垂直パリティ(VRC)」と「水平パリティ(LRC)」という用語が標準として定着しています。大切なのは、これらの標準用語の背後にある「計算の範囲と方向性」という本来の意味を理解することです。見た目のレイアウトに惑わされず、「VRCは単位内、LRCは単位間」と覚えておけば、混乱は少なくなるはずです。
まとめ:これでスッキリ!垂直・水平パリティ
- パリティチェックは、データにパリティビットを付加し、「1」の数が偶数か奇数かをチェックすることで、単純なエラーを検出する技術です。
- 垂直パリティ (VRC) は、個々のデータ単位(バイトなど)ごとに独立して計算されます。計算の概念的スコープがデータ単位のビットの並び(縦方向)であることから「垂直」と呼ばれます。
- 水平パリティ (LRC) は、複数のデータ単位からなるブロック全体にわたって、同じビット位置ごとに計算されます。計算の概念的スコープがデータブロックを横断する(水平方向、あるいは長手方向)であることから「水平」と呼ばれます。
- 「垂直」「水平」という名前は、パリティビットが図の中でどこに描かれるかではなく、計算がどの範囲(単位内か、単位間か)で行われるかを示しています。データの書き方によって、LRCが下の行になったり右の列になったりしますが、計算原理は同じです。
これで、「垂直」と「水平」の名称に関する長年の疑問が解消されたのではないでしょうか。しかし、パリティチェックの話はこれで終わりではありません。VRCとLRCを組み合わせることで、さらに強力な能力が生まれるのです。そして、これらの単純なパリティチェックには限界もあり、それを克服するためのより高度な技術も存在します。次の記事では、これらのトピックについて掘り下げていきましょう。