地球と近隣の銀河の間では、毎ミリ秒ごとに何兆ものメッセージが飛び交っています。しかし、これほど長い距離を伝えるのは一筋縄ではいきません。厄介な太陽フレア、時間のゆがみ、迷走する力、そして宇宙のチョウが羽ばたくだけでも、伝送中にあるビットが勝手に変わってしまうことがあります。
さて、何が起きるか想像してみましょう。
破損したメッセージを検出することは、ただ重要というだけではありません。不可欠です。受信側は、惨事が起きる前に、どこかで何かがおかしくなったことを_必ず_知る必要があります。
でも、どうやって?
宇宙中の科学者やエンジニアたちは、はるか昔からこの問題と格闘してきました。宇宙規模のAIスーパークラスターが総出でデータを処理し続けています。そしてある日、一つの伝説がよみがえります。古くから伝わる強力な方法。デバッグフォーラムでささやかれ、見すぎてしまったエンジニアたちがつぶやいていた、あの方法です……
パリティビット!
とてもシンプルで、それでいてとても強力な方法。これなら、星間通信を救えるかもしれません。
ここでの仕事は、次の2つを実装することです。
パリティビットは、伝送エラーを検出する簡単な方法です。
送信機と受信機は、一度に_ちょうど_8ビット(パリティビットを含む)しか送受信できません。
パリティビットは、各伝送で1のビットが_偶数_個になるように設定され、常に右から1番目のビットです。
したがって、受信機が11000001、01110101、01000000(つまり、1のビットが奇数個の伝送)を受け取ると、エラーがあることがわかります。
ただし、メッセージがこれほど短いことはほとんどなく、長い場合はシーケンスとして伝送する必要があります。
たとえば、メッセージ11000000 00000001 11000000 11011110(16進数ではC0 01 C0 DE)を考えてみましょう。
各伝送にはちょうど8ビットしか含められないため、データは7ビットとパリティビットだけを含めることができます。 そこで、データの7ビットごとにパリティビットを挿入する必要があります。
11000000 00000001 11000000 11011110
↑ ↑ ↑ ↑ (7th bits)
このメッセージの伝送シーケンスは、次のようになります。
1100000_ 0000000_ 0111000_ 0001101_ 1110
↑ ↑ ↑ ↑ (parity bits)
シーケンスの最初の伝送のデータ(1100000)には1のビットが2つ(偶数個)あるので、パリティビットは0です。
最初の伝送は11000000(16進数ではC0)になります。
次の伝送のデータ(0000000)には1のビットが0個(これも偶数個)あるので、パリティビットは再び0です。
したがって、2番目の伝送は00000000(16進数では00)になります。
次の2つの伝送のデータ(0111000と0001101)には、1のビットが3つあります。
伝送内の1のビットが偶数個になるように、これらのパリティビットは1に設定されます。
これらは01110001と00011011(16進数では71と1B)として伝送されます。
最後の伝送(1110)には、データが4ビットしかありません。
一度にちょうど8ビットが伝送され、パリティビットが一番右のビットなので、8ビットになるように0のビットを3つ追加し、そのあとにパリティビットを付けます。
これは次のようになります(_がパリティビットです)。
1110 000_
↑↑↑ (added 0 bits)
ここでも1のビットが奇数個なので、パリティビットは1です。
シーケンスの最後の伝送は11100001(16進数ではE1)になります。
このメッセージの伝送シーケンス全体は11000000 00000000 01110001 00011011 11100001(16進数ではC0 00 71 1B E1)です。