МатВектор

Command Palette

Search for a command to run...

🔀 Дискретка35 минСложность 3/5+70 XP

Коды Хэмминга: самокорректирующиеся данные

Один перевёрнутый бит — и данные чинят себя сами: расстояние Хэмминга, проверочные биты на степенях двойки и синдром с адресом ошибки. Полный разбор кода (7,4).

4 интерактива3 квизаУрок 19 из 20Обновлено 05.10.2026Обычный

Представьте: научные данные с межпланетной станции летят к Земле несколько часов, и по дороге в них портится один-единственный бит — частица от солнечной вспышки переворачивает ноль в единицу. Переспросить нельзя, повторная передача стоит месяцев. Данные обязаны чинить себя сами. Эту задачу решил Ричард Хэмминг в Bell Labs: он предложил код, который не просто замечает порчу, а называет адрес битого бита. Тот же код сегодня охраняет оперативную память серверов (маркировка ECC) и микросхемы, работающие под радиацией.

Канал в этой задаче — любой носитель: радиолиния, жёсткий диск, оперативная память. Модель элементарна: бит с некоторой вероятностью переворачивается, и мы не знаем, какой именно. Хороший код превращает эту слепоту в знание: принятая строка сама рассказывает, что с ней случилось.

Расстояние Хэмминга: насколько различаются слова#

Двоичное слово — строка из нулей и единиц фиксированной длины. Расстояние Хэмминга между словами — число позиций, в которых они различаются: , потому что первые три позиции не совпали, а четвёртая совпала. Эквивалентный способ: посчитайте число единиц в поразрядном XOR — получится то же самое. Это расстояние ведёт себя как настоящая метрика: неотрицательно, симметрично и подчиняется неравенству треугольника, так что слово не может быть одновременно близким к двум далёким друг от друга словам.

Передаётся не произвольная строка, а кодовое слово из заранее согласованного набора. Ошибка веса уводит слово на расстояние от оригинала. Вся механика обнаружения и исправления живёт в расстояниях. Пусть ближайшие кодовые слова отстоят друг от друга на . Тогда шары радиуса вокруг слов не задевают друг друга при — и любая принятая строка внутри шара однозначно указывает на свой центр, ошибку можно исправить. Для обнаружения ошибок хватает слабее условия : ошибка такого веса не способна превратить одно кодовое слово в другое.

$d_{\min}$Обнаруживает ошибокИсправляет ошибок
100
210
321
431
542
Границы: обнаружение при , исправление при

Бит чётности из урока об основах кодирования — код с : одиночную ошибку он видит, но локализовать не может, ведь любая из позиций даёт один и тот же симптом. Коррекция начинается с — именно к этому порогу идёт код Хэмминга.

Простейший исправляющий код известен со времён телеграфа — утроение: ноль отправляем как , единицу как . Расстояние между кодовыми словами : после одиночной ошибки два «правильных» бита против одного, и мажоритарное голосование восстанавливает исходный бит. Код работает, но дорог: из трёх битов полезен один, скорость . Хэмминг искал способ купить те же три единицы расстояния дешевле — и нашёл: три проверочных бита на четыре информационных.

Код$d_{\min}$ОбнаруживаетИсправляетСкорость
бит чётности210
утроение бита321
Хэмминг (7,4)321
Хэмминг (15,11)321
Четыре кода при равном расстоянии: Хэмминг экономнее в разы

Почему проверочные биты стоят на степенях двойки#

Схема Хэмминга для блока из 7 бит (код ): 4 бита данных и 3 проверочных. Проверочные занимают позиции — степени двойки, данные раскладываются по оставшимся местам:

Позиция1234567
Содержимое
Раскладка кода (7,4): проверки на позициях 1, 2, 4, данные — на 3, 5, 6, 7

Каждый проверочный бит делает свою группу чётной: сумма единиц по группе должна быть чётной (равна нулю по модулю 2):

  • проверяет позиции — номера с единицей в младшем двоичном разряде
  • проверяет позиции — номера с единицей во втором разряде
  • проверяет позиции — номера с единицей в третьем разряде

Правило выглядит случайным, а устроено глубоко: запишите номер позиции в двоичной системе — бит отвечает за младший разряд номера, за второй, за третий. Позиция попадает в группы и ; позиция — в группы и . Из-за этого номер испорченного бита кодируется сам собой: если чётность нарушили группы и , двоичное число — готовый адрес ошибки. Три проверки дают исходов: ноль означает «всё чисто», оставшиеся семь покрывают все позиции блока. Впритык, и это не совпадение, а конструкция кода: проверок должно хватать на исходов, отсюда требование .

Общая сборка: проверок держат блок длины , из которых данные занимают позиций. Проверки встают на — каждое место с единственной единицей в двоичной записи, данные стекаются на остальные. Хотите защитить 11 битов — берите : , выходит код с проверками на позициях 1, 2, 4, 8. Защитить 26 — , код . Чем длиннее блок, тем выше скорость, а гарантия та же: одна ошибка на блок.

Полный пример: от битов данных до исправленной ошибки#

Три проверочных бита купили способность исправлять любую одиночную ошибку в семи. Обратная сторона: две ошибки код вводит в заблуждение. Переверните биты 2 и 5 — синдром сложится как , потому что номера-«подписи» ошибок складываются по модулю 2. Декодер «починит» седьмой бит и испортит слово окончательно: расстояние 3 обещало двойные ошибки лишь обнаруживать, без коррекции. Поэтому в серверной памяти код Хэмминга расширяют ещё одним битом общей чётности до : одиночная ошибка исправляется, двойная обнаруживается, схема носит имя SECDED.

Тренировочный второй раунд: испорчен бит 6, на приёмнике слово . Группа чиста, группы и провалились — синдром . Прогоните группы вручную и убедитесь: декодер вернул слово без единого запроса к отправителю.

Сколько стоит защита: расстояние, граница, избыточность#

Минимальное расстояние кода Хэмминга равно 3, и это проверяется перебором: код линеен — XOR двух кодовых слов снова кодовое слово, ведь суммы, чётные по каждой группе, дают чётные суммы по той же группе, — а среди 15 ненулевых слов нет ни одного веса меньше 3. Например, слову данных отвечают проверки , , : кодовое слово весит ровно 3. Любая пара кодовых слов различается минимум в трёх позициях — отсюда и таблица выше: две ошибки обнаруживаются, одна исправляется.

Декодер собирается из трёх XOR-деревьев — по одному на группу — и дешифратора, переводящего синдром в номер бита. Вся проверка — три слоя логики глубиной в пару элементов: память с ECC чинит слово быстрее, чем процессор успевает его запросить. Синдром читается мгновенно: единицы в и при чистой — двоичное , бит 5; единица только в — двоичное , бит 2.

Граница Хэмминга оценивает предел экономности. Шар радиуса 1 вокруг слова длины 7 содержит строк: само слово плюс семь его соседей. Кодовых слов , и их шары занимают строк — всё пространство заполнено без зазоров и перекрытий. Код совершенный: каждая 7-битная строка либо кодовое слово, либо отстоит на один флип ровно от одного кодового слова. Совершенных кодов немного — , , при , и все они исправляют ровно одну ошибку на блок.

Теперь цена. Три проверочных бита на четыре информационных: скорость кода — почти половина пропускной способности уходит на страховку. У кода скорость уже , у — около : избыточность тает с ростом блока. Но растёт и уязвимость: чем длиннее блок, тем вероятнее в нём вторая ошибка, которую код не переживёт. Выбор длины — торг между экономией и надёжностью, а прикидки вроде «сколько строк покроют шары» — прямое приложение счёта из урока про перестановки, размещения и сочетания.

Геометрия здесь красивая: все 7-битные слова — вершины семимерного куба, рёбра соединяют слова на расстоянии 1 (анатомию графов напоминает урок про основы графов). Код Хэмминга — упаковка 16 непересекающихся кубиков радиуса 1 в куб из вершин. Аппарат XOR-проверок вырос из булевой алгебры; операции с таблицами истинности собраны в статье таблица истинности. Упаковка шаров в кубе — наглядная картинка того, почему граница Хэмминга вообще работает: пустот нет, двойных соседей нет. Закрепить руки — в тренажёре по комбинаторике, там же пригодится счёт соседей куба.

  • Расстояние Хэмминга — число различающихся позиций; обнаружение при , исправление при
  • Проверки на степенях двойки покрывают позиции по разрядам номера; синдром — готовый двоичный адрес ошибки
  • Код (7,4): , скорость , код совершенный:
  • Двойные ошибки только обнаруживаются; для их коррекции нужно расстояние 5 — например, коды БЧХ
Проверь себя+10 XP

Код имеет минимальное расстояние . Сколько ошибок он исправляет?

Проверь себя+10 XP

Сколько проверочных битов нужно для 11 битов данных (код Хэмминга (15,11))?

Проверь себя+10 XP

В коде (7,4) провалились проверки и , проверка чиста. Какой бит испорчен?

Частые вопросы

Почему проверочные биты именно на позициях 1, 2, 4, 8?

Потому что эти номера содержат по одной единице в двоичной записи. Такая проверка покрывает все позиции, у которых в номере стоит этот адресный бит: — все нечётные позиции, — позиции 2, 3, 6, 7, и дальше аналогично. Синдром тогда складывается прямо в двоичный номер ошибки. Проверки можно расставить и иначе, но адрес битого бита перестанет читаться напрямую из синдрома.

Чем код Хэмминга отличается от простого бита чётности?

Бит чётности — один проверочный бит, минимальное расстояние 2: одиночную ошибку он обнаруживает, но не говорит, где она. Код Хэмминга ставит несколько перекрывающихся проверок и поднимает расстояние до 3, поэтому синдром локализует бит с точностью до позиции. Плата — три проверочных бита на четыре данных в коде (7,4) вместо одного бита чётности.

Что такое совершенный код?

Это код, чьи шары исправления вокруг кодовых слов замощают всё пространство строк без зазоров и наложений. Для кода (7,4): 16 слов, вокруг каждого шар из 8 строк, всего — покрытие полное. Любая принятая строка находится на расстоянии не больше 1 ровно от одного кодового слова, и декодер всегда выносит однозначный вердикт.

Можно ли кодом Хэмминга исправить две ошибки?

Базовый код (7,4) — нет: при две ошибки маскируются под одну в другой позиции, и «исправление» портит слово. Расширение с общим битом чётности (SECDED, ) исправляет одну ошибку и обнаруживает две — так защищена ECC-память серверов. Для коррекции двух ошибок нужен код с , например коды БЧХ.

Готовитесь к контрольной?

Чеклист тем по «Дискретка»: что вы уже умеете, что повторить и в каком порядке.

Открыть чеклист предмета →

Проверьте себя в бою

Босс-экзамен по «Дискретка»: квизы всех уроков плюс бесконечный поток сгенерированных задач. Каждая попытка — новый расклад.

Начать босс-экзамен →