ハミング符号シミュレーター 戻る
電気・通信

ハミング符号シミュレーター

ハミング(7,4)符号で「誤りを検出するだけでなく、どこが間違ったかを突き止めて自動で直す」しくみを体験できるツールです。4つのデータビットから符号語を作り、好きな位置に1ビットの誤りを注入すると、シンドロームが誤り位置を指し示し、訂正される様子がリアルタイムで分かります。

パラメータ設定
データビット 1
符号語の位置3に入る(0 または 1)
データビット 2
符号語の位置5に入る(0 または 1)
データビット 3
符号語の位置6に入る(0 または 1)
データビット 4
符号語の位置7に入る(0 または 1)
誤り注入位置
0 = 誤りなし、1〜7 = その位置のビットを反転
計算結果
符号語(7ビット)
パリティビット p1·p2·p4
シンドローム
検出された誤り位置
訂正後データ
訂正の成否
符号語とシンドローム — 誤り検出アニメーション

7ビットの符号語を位置1〜7のセルで表示します。パリティビット(位置1·2·4)とデータビットは色分け、注入された誤りビットは赤で点滅。下の3本のアークが各パリティの検査範囲、矢印がシンドロームの指す誤り位置です。

符号化率と冗長性の比較
パリティ検査のカバー範囲
理論・主要公式

$$p_1=d_1\oplus d_2\oplus d_4,\quad p_2=d_1\oplus d_3\oplus d_4,\quad p_4=d_2\oplus d_3\oplus d_4$$

符号化(偶数パリティ)。パリティビットは2のべき乗位置 1・2・4 に置き、データビット d1〜d4 は位置 3・5・6・7 に入る。$\oplus$ は排他的論理和(XOR)。

$$s_1=r_1\oplus r_3\oplus r_5\oplus r_7,\quad s_2=r_2\oplus r_3\oplus r_6\oplus r_7,\quad s_4=r_4\oplus r_5\oplus r_6\oplus r_7$$

復号。受信語 r(位置 r1〜r7)から3つのシンドロームビットを計算する。

$$\text{シンドローム}=4\,s_4+2\,s_2+s_1$$

シンドローム (s4 s2 s1) を2進数として読んだ値が、そのまま誤ったビットの位置になる(0 なら誤りなし)。その位置を反転すれば訂正完了。

ハミング符号とは

🙋
データを送るとき「パリティビット」で誤りをチェックするって習いました。でもこのツールは「誤りを直す」って書いてあります。チェックと訂正って違うんですか?
🎓
そこが今日の肝だよ。普通のパリティビットは1個だけ。「1のビットが偶数個か奇数個か」を見るだけだから、誤りが起きたことは分かっても、7ビットのうちどれが間違っているかは特定できない。直しようがないんだ。ハミング符号はパリティを「3個」使う。しかも3個それぞれが、わざと重なり合った別々のビット集合を見張る。誤りが起きると「どの検査が失敗したか」のパターンが、間違ったビットの番地を2進数で教えてくれるんだ。
🙋
番地を教えてくれる…?パリティが3個あると、なんで位置が分かるんですか?
🎓
ざっくり言うと、3個のパリティの失敗・成功を 0/1 で並べると3桁の2進数になる。3桁の2進数は0から7まで表せるだろう? ハミングの天才的なところは、パリティの担当範囲を「位置1のパリティは番地の1の位が立っている位置、位置2のパリティは2の位、位置4のパリティは4の位を担当する」というふうに割り当てたこと。だから誤りが起きると、失敗したパリティの組み合わせがそのまま誤り位置の2進数表記になる。左で「誤り注入位置」を5にしてみて。シンドロームが101、つまり2進数の5を指すはずだ。
🙋
本当だ、101って出てます!じゃあ誤りがないときはどうなるんですか?
🎓
「誤り注入位置」を0にしてみて。シンドロームが000、つまり位置0になる。位置0は「誤りなし」を意味する特別な値なんだ。これがうまくできていて、誤りがなければ全パリティ検査が成功=シンドロームが全部0になる。逆に1ビットでも狂えば、必ず1〜7のどれかの値になって誤り位置を指す。受信側はその位置のビットをパチッと反転させるだけ。再送なしで、その場で直せるんだ。
🙋
魔法みたいですね。じゃあ2ビット間違ってもこの方法で直せるんですか?
🎓
そこは正直に言うと、ハミング(7,4)符号は1ビットまでしか直せない。2ビット誤ると、シンドロームが「別の1ビット誤り」のパターンとたまたま一致してしまって、間違った場所を「訂正」してかえって傷を増やすことがある。だから実務では、全体パリティをもう1ビット足した拡張ハミング(8,4)符号で「1ビット訂正+2ビット検出」にするのが定番。さらに強くしたいなら、リード・ソロモン符号みたいな距離の大きい符号を使う。それでもハミング符号は、現代のあらゆる誤り訂正符号の出発点なんだよ。
🙋
そんな古い符号が、今でも使われているんですか?
🎓
使われているどころか、今この瞬間も働いているよ。サーバーのECCメモリがそれだ。DRAMのビットは宇宙線や電気的ノイズで時々勝手に反転する。ECCメモリはハミング符号系の回路で、そのビット反転をリアルタイムに、誰にも気づかれずに直し続けている。1950年にリチャード・ハミングが考えたしくみが、70年以上たった今もデータセンターを支えているんだ。

よくある質問

普通のパリティビットは1個だけで、1ビット誤りが「起きたかどうか」しか分かりません。どのビットが間違っているかは特定できず、訂正もできません。ハミング(7,4)符号はパリティビットを3個使い、それぞれが重なり合う異なるビット集合を検査します。誤りが起きるとどの検査が失敗したかのパターン(シンドローム)が、誤ったビットの位置を2進数で指し示します。受信側はそのビットを反転させるだけで訂正できます。これが「検出」と「訂正」の決定的な違いです。
シンドロームは受信語に対して3つのパリティ検査を再計算した結果です。s1 = r1⊕r3⊕r5⊕r7、s2 = r2⊕r3⊕r6⊕r7、s4 = r4⊕r5⊕r6⊕r7 の3ビットを (s4 s2 s1) の順に並べて2進数として読むと、その値がそのまま誤ったビットの位置(1〜7)になります。0なら誤りなしです。各パリティが「自分の担当範囲に偶数個の1があるか」を確かめ、失敗の組み合わせが位置のアドレスを綴る、という巧妙な設計になっています。
いいえ。ハミング(7,4)符号は最小ハミング距離が3で、訂正できるのは「1ビット誤りまで」です。2ビット誤りは検出はできますが、シンドロームが別の1ビット誤りのパターンと一致してしまい、誤った位置を「訂正」して状況をさらに悪化させることがあります。2ビット訂正が必要なら、より距離の大きい符号(拡張ハミング符号、BCH符号、リード・ソロモン符号など)を使います。拡張ハミング(8,4)符号は全体パリティを1ビット足すことで「1ビット訂正+2ビット検出(SECDED)」を実現します。
最も有名な用途はECC(誤り訂正符号)メモリです。サーバーやワークステーションのDRAMでは、宇宙線や電気的ノイズで起きるビット反転を、ハミング符号系の回路がリアルタイムで静かに訂正しています。ほかにもNANDフラッシュメモリのコントローラ、初期のモデム通信、衛星・宇宙機のテレメトリなど、再送が難しい・許されない場面で広く使われてきました。リチャード・ハミングが1950年に発表したこの符号は、現代のあらゆる誤り訂正符号の出発点になっています。

実世界での応用

ECCメモリ(誤り訂正メモリ):ハミング符号の最も身近で重要な用途です。サーバー・ワークステーション・基幹システムのDRAMでは、宇宙線(中性子)の衝突や電気的ノイズによってメモリセルのビットが勝手に反転する「ソフトエラー」が一定確率で発生します。ECCメモリは64ビットのデータに対して8ビットの検査ビットを付け、ハミング符号系のSECDED方式で1ビット誤りを訂正、2ビット誤りを検出します。ユーザーやOSはエラーが起きたことすら気づかず、計算は静かに正しく続行されます。

NANDフラッシュメモリとSSD:フラッシュメモリは書き込み・読み出しを繰り返すとセルが劣化し、ビット誤りが増えていきます。SSDやUSBメモリのコントローラには誤り訂正回路が組み込まれており、初期の製品ではハミング符号、現在はより強力なBCH符号やLDPC符号が使われます。ハミング符号は仕組みが単純で回路が小さく高速なため、誤り率が低い用途では今も現役です。

通信・データ伝送:初期のモデム通信、衛星・宇宙機からのテレメトリ、産業用のシリアル通信などで、ハミング符号は「再送できない・再送したくない」一方向通信の誤り訂正に使われてきました。ノイズで化けたビットを受信側だけで直せるため、往復の通信時間が長い宇宙通信では特に価値があります。深宇宙探査機ではさらに強力な符号と組み合わせて使われます。

情報理論・符号理論の教材:ハミング符号は「誤り訂正符号とは何か」を学ぶ最初の題材として世界中の大学で扱われます。最小ハミング距離、シンドローム復号、生成行列・検査行列、符号化率と訂正能力のトレードオフといった符号理論の基本概念が、(7,4)というコンパクトな例の中に全部詰まっているからです。本シミュレーターも、その概念を手を動かして体感するための教材として作られています。

よくある誤解と注意点

まず最も多い誤解が、「ハミング符号なら何ビット誤っても直してくれる」というものです。ハミング(7,4)符号が訂正できるのは厳密に「1ビットまで」です。これは符号語どうしの最小ハミング距離が3であることから来ています。距離3の符号は「1ビット訂正」または「2ビット検出」のどちらかしかできません。2ビット誤りが起きると、シンドロームは0以外の値になりますが、それは別の1ビット誤りのパターンと区別がつかず、ツールは存在しない「1ビット誤り」を訂正してしまい、結果的に3ビット狂った語を出力することすらあります。誤り率が高い回線では、距離の大きい符号を選ぶか、何重にも符号を重ねる必要があります。

次に、「シンドロームが0なら絶対に誤りがない」と思い込むこと。シンドロームが0になるのは「誤りがない」場合だけではありません。誤りパターンがちょうど別の正しい符号語に一致してしまった場合(つまり距離3以上のビットが同時に都合よく反転した場合)にも、シンドロームは0になります。これを「検出漏れ」といいます。1ビット・2ビット誤りでは起きませんが、3ビット以上の誤りでは起こり得ます。シンドローム0は「1〜2ビット誤りはない」という意味であって、「絶対に無傷」を保証するものではありません。

最後に、「冗長ビットは無駄だから少ないほどよい」という単純化です。ハミング(7,4)符号の符号化率は4/7 ≈ 0.57で、送るデータの約4割が検査ビットに使われます。一見もったいなく見えますが、ハミング(15,11)なら11/15 ≈ 0.73、ハミング(31,26)なら26/31 ≈ 0.84と、符号語を長くするほど冗長性の割合は下がります。ただし長い符号ほど「1個の符号語の中で2ビット以上誤る確率」が上がり、訂正能力(1ビットまで)は変わらないため誤り訂正の信頼性は下がります。符号長は「冗長性の少なさ」と「誤りに耐える力」のトレードオフで、回線の誤り率に応じて選ぶべきものです。

使い方ガイド

  1. d1~d4に4ビットの情報ビット(例:1010)を入力して符号語生成ボタンをクリック
  2. パリティビットp1、p2、p4が自動計算され7ビット符号語が生成される
  3. 任意の1ビット位置を選択して誤りを挿入し、シンドローム計算を実行してS1、S2、S4の値を確認
  4. シンドロームの3ビット値から誤り位置が特定され、該当ビットが自動訂正される
  5. 訂正前後のビット列と訂正成否を比較して誤り訂正の原理を確認

具体的な計算例

情報ビット d1=1、d2=0、d3=1、d4=0を入力した場合、パリティビットはp1=0(d1⊕d3⊕d4)、p2=1(d1⊕d2⊕d4)、p4=1(d2⊕d3⊕d4)で符号語は1011010となる。3ビット目に誤りを挿入して1001010に変化させると、シンドローム計算によりS1=1、S2=0、S4=1が得られ、シンドローム値011は10進数3を示す。3ビット目の誤りが特定され、訂正後は元の1011010に復帰する。

実務での注意点

  1. ハミング(7,4)符号は通信機器やメモリシステムで単一誤り訂正に用いられるため、2ビット以上の誤りが発生する環境では検出のみで訂正はできない点に注意
  2. 衛星通信やデータセンターのECC-DRAM採用時は誤り率と符号オーバーヘッド(7ビット中4ビットのみ情報)のバランスを設計段階で検証すること
  3. シンドローム値が全て0の場合は誤りなしだが、パリティビット計算ロジックの実装誤りがないか配線設計でダブルチェックが必須