ハミング符号(Hamming code)
検査ビットを複数置いて、1ビットの誤りなら、どこが化けたかまで突き止めて直せる符号。
もう少し詳しい説明
ハミング符号は、誤りを見つけるだけでなく、どのビットが化けたかまで突き止めて直せる符号です。
ビットは、0か1のどちらかを入れる、1けたの入れ物です。通信や記憶のとちゅうで、この0と1がひっくり返ってしまうことがあります。0が1に、1が0に変わる。これをビットが化けるといいます。
検査ビットは、データ本体とは別に付け足す、確かめ用のビットです。本体が化けていないかを調べるために使います。
パリティチェック(検査ビットを1つ足して、1の個数が偶数か奇数かで誤りを見つける方法)は検査ビットが1つしかないので、「どこかおかしい」までしか分かりませんでした。ハミング符号は検査ビットを複数置いて、その組合せで位置を特定します。
見る範囲を少しずつずらす
データ4ビットに検査ビット3つを足した、7ビットのハミング符号で見ます。検査ビットは位置1・2・4に入ります。
3つの検査ビットが見ている位置を、よく見てください。
- P1 … 1・3・5・7
- P2 … 2・3・6・7
- P3 … 4・5・6・7
完全に重なってもいないし、まったく別々でもない。 少しずつずれて重なっています。ここが仕掛けです。
どの検査が合わないかで、位置が決まる
位置5のビットが化けたとします。5を見ているのは P1 と P3 なので、この2つの検査が合わなくなります。P2 は5を見ていないので、そのままです。
そこで、合わなかった検査ビットの位置を足します。P1 は位置1、P3 は位置4にいるので、1 + 4 = 5。
化けた位置そのものが出ました。たまたまではありません。位置1〜7のどれが化けても、同じやり方で必ず当たります。
| 化けた位置 | 合わない検査 | 足すと |
|---|---|---|
| 1 | P1 | 1 |
| 3 | P1・P2 | 1 + 2 = 3 |
| 5 | P1・P3 | 1 + 4 = 5 |
| 7 | P1・P2・P3 | 1 + 2 + 4 = 7 |
3つとも合っていれば、誤りはありません。 足す位置が1つも無いので、答えは0。「誤り無し」がそのまま出る形になっています。
逆に3つとも合わなかった場合は、1 + 2 + 4 = 7 で、位置7の1ビットが化けたということです。誤りが3か所あるわけではありません。合わない検査の数は、誤りの個数ではなく位置を表す数字の組合せです。
実際に1ビット直してみる
データ4ビットを 1 0 1 1 として、7ビットに組み立てます。データは位置3・5・6・7に入り、検査ビットはそれぞれの組で1の個数が偶数になるように決めます。
位置5が0から1に化けて届きました。3つの検査を確かめます。
各組は、送るときに1の個数が偶数になるようにしてあります。 そのため、偶数のままなら無事、奇数になっていれば、その組の中のどれかが化けたということです(パリティチェックを、組ごとに行っているだけです)。
- 位置1の検査(1・3・5・7)…
0 1 1 1で1が3個(奇数)→ 合わない - 位置2の検査(2・3・6・7)…
1 1 1 1で1が4個(偶数)→ 合う - 位置4の検査(4・5・6・7)…
0 1 1 1で1が3個(奇数)→ 合わない
合わないのは位置1と位置4の検査なので、1 + 4 = 5。位置5が化けたと分かります。
あとはそのビットを反転させるだけです。位置5はいま 1 なので 0 に戻すと 0 1 1 0 0 1 1 となり、送ったものと一致しました。
ビットは0か1の2通りしかないので、場所さえ分かれば、正しい値は1つに決まります。「直す」といっても、やることは1ビットの反転だけです。
なぜこの3つの見方になるのか
検査ビットを位置1・2・4に置き、見る範囲をこう決めているのは、位置を2進数で書いたときを考えているからです。
| 位置 | 2進数 | P1(1の位) | P2(2の位) | P3(4の位) |
|---|---|---|---|---|
| 5 | 101 | ○ | ○ | |
| 6 | 110 | ○ | ○ | |
| 7 | 111 | ○ | ○ | ○ |
それぞれの検査ビットが、2進数の1つの桁を受け持っているわけです。合わなかった検査を並べると、そのまま化けた位置の2進数になります。
ここまで分からなくても解ける問題がほとんどですが、「なぜ 1・2・4 なのか」が引っかかるなら、この見方で納得できるはずです。
どこまで直せるか
ハミング符号でできることは、ふつう次のとおりです。
- 1ビットの誤り … 検出できて、訂正もできる
- 2ビットの誤り … 検出はできるが、訂正はできない(検査ビットを1つ足した拡張ハミング符号の場合)
- 3ビット以上 … 保証されない
何ビットまで直せるかは、検査ビットを何本持つかで決まります。 直せる範囲を広げたければ検査ビットを増やすしかなく、そのぶん送るデータは増えます。直す力と、増える量は引き換えです。
何に使われているのか
メモリ(主記憶ともいいます。いま実行中のプログラムとデータを置いておく記憶装置)のECC(Error Correcting Code。誤り訂正機能付きメモリ)が代表例です。
サーバ(要求を受け取って、応えを返す側の機械)のように止めたくない機械では、宇宙線などでメモリの1ビットが勝手に反転することがあります。ECC付きのメモリなら、それをその場で直してしまいます。
試験では RAID2(複数のディスクを束ねて使う技術のうち、ハミング符号で誤りを直す方式)がハミング符号を使う方式として出てきますが、実際にはほとんど使われていません。名前だけ押さえておけば足ります。
試験ではこう出る
科目A(旧・午前)で出ます。
いちばん多いのは、ハミング符号で何ができるかを選ばせる問題です。「1ビットの誤りを訂正できる」が答えになる形で、パリティチェック(検査ビットを1つ足す方法)やCRC(Cyclic Redundancy Check。巡回冗長検査。データを決まった数で割った余りを検査に使う方法)と並べて出されます。
検出だけか、訂正までかという線引きが、そのまま正誤の分かれ目になります。
| 方式 | 検出 | 訂正 |
|---|---|---|
| パリティチェック | ○(奇数個の誤り) | × |
| CRC | ○(強い) | × |
| ハミング符号 | ○ | ○(1ビット) |
応用情報では、具体的なビット列を与えて検査ビットの値を計算させたり、化けた位置を答えさせたりする形も出ます。そのときは、上の「合わない検査の位置を足す」で求められます。
関連する用語
- パリティチェック
- 1ビットだけ足す検査。おかしいことは分かるが、どこが化けたかは分からない
- CRC
- 割り算の余りを検査に使う方式。検出に強いが、位置の特定はしない
- ECC
- 誤り訂正符号の総称。メモリのECCにはハミング符号の考え方が使われている
- RAID
- ディスクを束ねる技術。RAID2 はハミング符号を使う方式として試験に出る
ミニクイズ
ハミング符号の説明として、最も適切なものはどれか。
正解は 2番:検査ビットを複数置き、1ビットの誤りならどこが化けたかを特定して訂正できる
ハミング符号は、見る範囲が少しずつ重なるように検査ビットを複数置きます。そのため、どの検査が合わないかの組合せで化けた位置が1つに決まり、そのビットを反転させれば直せます。検査ビットが1つだけで訂正できないのはパリティチェック、割り算の余りを使うのはCRC(巡回冗長検査。データを決まった数で割った余りを検査に使う方法)です。同じものを3回送る多数決は、誤り訂正の考え方ではありますが符号ではなく、ハミング符号より送る量がはるかに増えます。
この分野をまとめて解く → 基礎理論と情報メディアのミニテスト(全39問)
最終更新:2026-10-06