<?xml version="1.0" encoding="utf-8"?> 
<rss version="2.0">

<channel>

<title>Light, заметки с тегом: код Хэмминга</title>
<link>https://boyarkirk.ru/?go=tags/kod-hemminga/</link>
<description></description>
<generator>E2 (v3254; Aegea)</generator>

<item>
<title>Простой код Хэмминга. Практика.</title>
<guid isPermaLink="true">https://boyarkirk.ru/?go=all/prostoy-kod-hemminga-praktika/</guid>
<link>https://boyarkirk.ru/?go=all/prostoy-kod-hemminga-praktika/</link>
<comments>https://boyarkirk.ru/?go=all/prostoy-kod-hemminga-praktika/</comments>
<description>&lt;p&gt;ВНИМАНИЕ! Это разжёванная версия замечательной статьи, которая есть на &lt;a href="http://habrahabr.ru/post/140611/"&gt;хабре&lt;/a&gt;!&lt;br /&gt;
Если вам нужно лаконичное объяснение, то вам туда! Если же вы в этом ничего не понимаете и требуется пошаговое разбирательство, то милости прошу читать дальше. То есть, где вам понятнее — там и читайте. Статья на &lt;a href="http://habrahabr.ru/post/140611/"&gt;хабре&lt;/a&gt; не моя, но я считаю, что она шикарна!&lt;/p&gt;
&lt;p&gt;Итак. Задача. Использовать код Хэмминга для двоичного сообщения, длина слова у которого составляет 16 бит. Исходное сообщение возьмём такое «0100010000111101». То есть в слове 16 «букв», каждая из которых может принимать значение либо «0», либо «1».&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://boyarkirk.ru/pictures/_023.jpg" width="695" height="43" alt="" /&gt;
&lt;/div&gt;
&lt;h2&gt;Кодирование&lt;/h2&gt;
&lt;p&gt;Сначала в исходное сообщение добавляем контрольные биты и устанавливаем их в нуль.&lt;br /&gt;
Контрольные биты располагаются в тех номерах битов, которые равны степеням двойки (ибо алфавит двоичный).&lt;br /&gt;
То есть. Два в степени нуль — это единица, два в степени 1 = два, два в степени 2 = четыре, а два в степени 3 = восемь, два в степени 4 = 16&lt;br /&gt;
Значит контрольные биты будут находиться в «буквах»(битах) под номерами 1, 2, 4, 8 и 16.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://boyarkirk.ru/pictures/_024.jpg" width="692" height="37" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;В остальные номера бит переписываем исходное сообщение.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://boyarkirk.ru/pictures/_025.jpg" width="694" height="38" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Видно, что длина «слова» из-за такой избыточности увеличилась на пять «букв». В данном случае, конечно. У вас количество дополнительных бит будет зависеть от длины исходного «слова».&lt;/p&gt;
&lt;p&gt;Теперь нужно вычислить эти контрольные биты.&lt;br /&gt;
Каждый контрольный бит с номером N «контролирует»  непрерывную последовательность из N битов, через каждые N битов.&lt;/p&gt;
&lt;p&gt;Вот на картинке отмечено иксами (X), какие биты нужно использовать для вычисления первого контрольного бита (с номером «1»)&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://boyarkirk.ru/pictures/_027.jpg" width="694" height="54" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Для вычисления контрольно бита нужно просто сложить все «буквы» нашего «слова», которые он контролирует, а затем принять нелёгкое решение: если сумма получилась чётная, то пишем в результате нуль, а если нечётная — единицу.&lt;/p&gt;
&lt;p&gt;Вычисляем &lt;b&gt;первый бит&lt;/b&gt;.&lt;br /&gt;
Складываем биты под номерами 3,5,7,9,11,13,15,17,19,21&lt;br /&gt;
Это будет 0 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 = 1 + 1 + 1 + 1 + 1 = 5&lt;br /&gt;
Получилось 5 (пять). Сумма нечётная (на два нацело не делится). Значит пишем в первый бит единицу:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://boyarkirk.ru/pictures/_028.jpg" width="690" height="54" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Теперь вычислим контрольный &lt;b&gt;бит номер 2&lt;/b&gt;.  Для него нужно будет найти сумму каждых двух бит следующих друг за другом непрерывно, через каждые два бита. Такие биты я тоже отметил на картинке.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://boyarkirk.ru/pictures/_029.jpg" width="692" height="54" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;То есть будем теперь суммировать биты, начитая с третьего по номеру, и далее те, которые отмечены иксом (X).&lt;br /&gt;
Их номера 3, 6, 7, 10, 11, 14, 15, 18, 19.&lt;br /&gt;
Это будет 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 = 4&lt;br /&gt;
Четыре — число чётное, значит оставляем в нашем втором бите нуль.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://boyarkirk.ru/pictures/_030.jpg" width="693" height="40" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Переходим к вычислению &lt;b&gt;третьего контрольного бита&lt;/b&gt;. Но это у нас он контрольный — третий. А в сообщении этот бит записан под &lt;b&gt;номером 4&lt;/b&gt; — четыре.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://boyarkirk.ru/pictures/_031.jpg" width="689" height="55" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Значит и использовать будем все попадающие под наше правило биты, начиная с пятого.&lt;br /&gt;
А это биты под номерами 5, 6, 7, 12, 13, 14, 15, 20, 21.&lt;br /&gt;
Складываем их: 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 = 3&lt;br /&gt;
В итоге у нас нечётное число, значит пишем в наш контрольный бит единицу.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://boyarkirk.ru/pictures/_032.jpg" width="691" height="38" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Осталось всего ничего — &lt;b&gt;вычислить два оставшихся контрольных бита&lt;/b&gt;, которые под номерами 8 и 16.&lt;/p&gt;
&lt;p&gt;В восьмом оставляем нуль потому, что в той последовательности, которую мы используем для вычисления присутствуют две единицы, дающие в сумме чётное число.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://boyarkirk.ru/pictures/_033.jpg" width="691" height="53" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;А в 16-м тоже сумма бит получается чётной — оставляем нуль:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://boyarkirk.ru/pictures/_035.jpg" width="692" height="52" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;В итоге мы получили слово с кодом Хэмминга, которое содержит избыточные биты (в сумме 21): «100110000100001011101».&lt;/p&gt;
&lt;h2&gt;Декодирование&lt;/h2&gt;
&lt;p&gt;А теперь представим, что к нам пришло сообщение с ошибкой. Вот оно «100110001100001011101».&lt;br /&gt;
Мы знаем, что в него добавлены избыточные биты по алгоритму Хемминга, и нам надо проверить, есть в нём ошибка или нет.&lt;/p&gt;
&lt;p&gt;Для этого нужно поступить следующим образом. Сначала вычисляем заново все контрольные биты по предыдущему алгоритму.&lt;br /&gt;
Для этого сначала обнуляем все биты, находящиеся на номерах степеней двойки:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://boyarkirk.ru/pictures/_036.jpg" width="691" height="41" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;В первом оставляем нуль, ибо в подконтрольных битах чётное число единиц.&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://boyarkirk.ru/pictures/_038.jpg" width="693" height="52" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Вычисляем все остальные контрольные биты по описанному выше алгоритму (мне лень заново его описывать тут), и получаем, что не совпадают контрольные биты под номерами 1 и 8:&lt;/p&gt;
&lt;div class="e2-text-picture"&gt;
&lt;img src="https://boyarkirk.ru/pictures/_039.jpg" width="847" height="54" alt="" /&gt;
&lt;/div&gt;
&lt;p&gt;Теперь складываем номера этих контрольных бит: 1 + 8, и получаем 9 — номер бита, в котором закралась ошибка! Ура! Теперь просто меняем девятый бит на обратный — с единицы на нуль, — и получаем исходное сообщение!&lt;/p&gt;
&lt;p&gt;Отметим, что это самый простейший алгоритм Хемминга, который может исправить только одну ошибку в слове. Об остальных алгоритмах данная статья умалчивает. :)&lt;/p&gt;
</description>
<pubDate>Wed, 30 Dec 2015 04:55:22 +0000</pubDate>
</item>


</channel>
</rss>