ハミング符号(Hamming code)

分類
テクノロジ系 基礎理論
出る試験
基本情報応用情報
重要度
★★★☆☆

検査ビットを複数置いて、1ビットの誤りなら、どこが化けたかまで突き止めて直せる符号。

もう少し詳しい説明

ハミング符号は、誤りを見つけるだけでなく、どのビットが化けたかまで突き止めて直せる符号です。

ビットは、0か1のどちらかを入れる、1けたの入れ物です。通信や記憶のとちゅうで、この0と1がひっくり返ってしまうことがあります。0が1に、1が0に変わる。これをビットが化けるといいます。

検査ビットは、データ本体とは別に付け足す、確かめ用のビットです。本体が化けていないかを調べるために使います。

パリティチェック(検査ビットを1つ足して、1の個数が偶数か奇数かで誤りを見つける方法)は検査ビットが1つしかないので、「どこかおかしい」までしか分かりませんでした。ハミング符号は検査ビットを複数置いて、その組合せで位置を特定します。

見る範囲を少しずつずらす

データ4ビットに検査ビット3つを足した、7ビットのハミング符号で見ます。検査ビットは位置1・2・4に入ります。

位置1234567中身P1P2D1P3D2D3D4P1が見る1357P2が見る2367P3が見る4567
検査ビットは位置1・2・4に入り、残りがデータです。下の3行が、それぞれの検査ビットが見ている位置。見る範囲が少しずつ重なっているので、どの検査が合わないかの組合せで、化けた位置が1つに決まります。

3つの検査ビットが見ている位置を、よく見てください。

完全に重なってもいないし、まったく別々でもない。 少しずつずれて重なっています。ここが仕掛けです。

どの検査が合わないかで、位置が決まる

位置5のビットが化けたとします。5を見ているのは P1 と P3 なので、この2つの検査が合わなくなります。P2 は5を見ていないので、そのままです。

そこで、合わなかった検査ビットの位置を足します。P1 は位置1、P3 は位置4にいるので、1 + 4 = 5。

化けた位置そのものが出ました。たまたまではありません。位置1〜7のどれが化けても、同じやり方で必ず当たります。

化けた位置合わない検査足すと
1P11
3P1・P21 + 2 = 3
5P1・P31 + 4 = 5
7P1・P2・P31 + 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の個数が偶数になるように決めます。

位置1234567送った0110011届いた0110111直した0110011
位置5の1ビットだけが0から1に化けた例です。合わない検査から位置5と分かるので、そこを0に戻せば送ったものに一致します。

位置5が0から1に化けて届きました。3つの検査を確かめます。

各組は、送るときに1の個数が偶数になるようにしてあります。 そのため、偶数のままなら無事、奇数になっていれば、その組の中のどれかが化けたということです(パリティチェックを、組ごとに行っているだけです)。

合わないのは位置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の位)
5101○○
6110○○
7111○○○

それぞれの検査ビットが、2進数の1つの桁を受け持っているわけです。合わなかった検査を並べると、そのまま化けた位置の2進数になります。

ここまで分からなくても解ける問題がほとんどですが、「なぜ 1・2・4 なのか」が引っかかるなら、この見方で納得できるはずです。

どこまで直せるか

ハミング符号でできることは、ふつう次のとおりです。

何ビットまで直せるかは、検査ビットを何本持つかで決まります。 直せる範囲を広げたければ検査ビットを増やすしかなく、そのぶん送るデータは増えます。直す力と、増える量は引き換えです。

何に使われているのか

メモリ(主記憶ともいいます。いま実行中のプログラムとデータを置いておく記憶装置)の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