Давайте попробуем объяснить это немного:
У нас есть 3-битное число. Возможности могут быть представлены в виде куба, где каждый бит представляет ось. Восемь возможностей по углам.
000 --------001
| \ | \
| 100---------101
| | | |
| | | |
010-|-------011 |
\| \|
110---------111
Каждый дефект (например, 101 читается как 100) приводит к смещению линии на кубе.
Если мы используем два бита для данных и третий для проверки на четность (скажем, например, четность). Мы теряем 4 точки данных. Но у него есть то преимущество, что мы можем обнаружить сбой одного бита (который преобразует четное число единиц в нечетное число единиц).
Нечетные числа отмечены *. И мы видим, что каждое нечетное (ошибочно переданное) слово окружено четными (правильно переданными) словами. Поэтому, если мы получим 100, мы можем быть уверены, что это неправильно.
Но (с ошибкой в один бит) правильное представление могло бы быть 000, 101 или 110. Поэтому мы можем обнаружить, что что-то было не так, но мы не можем обнаружить, что было неправильно:
000 -------*001
| \ | \
|*100---------101
| | | |
| | | |
*010-|-------011 |
\| \|
110--------*111
Это называется однобитовым кодом обнаружения ошибок.
Если мы используем другой бит для проверки и, таким образом, удаляем его для данных. Нам осталось 1 бит данных и 2 «контрольных бита».
В этом случае предположим, что 000 и 111 являются действительными представлениями данных, а остальные шесть - нет. Теперь у нас интересная ситуация, если один бит поврежден во время транспортировки.
Если мы отправим 000 и получим 010, мы увидим, что 010 имеет одного действительного соседа (000) и двух недействительных (110 и 011). Итак, теперь мы знаем, что намеревались отправить 000, и можем исправить это:
000 -------*001
| \ | \
|*100--------*101
| | | |
| | | |
*010-|------*011 |
\| \|
*110---------111
Это называется однобитовым кодом исправления ошибок.
Обратите внимание, что однобитовый код, исправляющий ошибки, также является двухбитным кодом, определяющим ошибки.
И, вообще говоря,
Если у вас есть n контрольных битов, у вас есть n-битный код обнаружения ошибок.
Если у вас 2n контрольных битов, у вас есть n-битный код исправления ошибок.
Конечно, вы должны заказать «действительные» коды, чтобы они не граничили друг с другом.