{
    "version": "https:\/\/jsonfeed.org\/version\/1",
    "title": "Light, заметки с тегом: код Хэмминга",
    "home_page_url": "https:\/\/boyarkirk.ru\/?go=tags\/kod-hemminga\/",
    "feed_url": "https:\/\/boyarkirk.ru\/?go=tags%2Fkod-hemminga%2Fjson%2F",
    "icon": "https:\/\/boyarkirk.ru\/user\/userpic@2x.jpg",
    "author": {
        "name": "Серёга",
        "url": "https:\/\/boyarkirk.ru\/",
        "avatar": "https:\/\/boyarkirk.ru\/user\/userpic@2x.jpg"
    },
    "items": [
        {
            "id": "9",
            "url": "https:\/\/boyarkirk.ru\/?go=all\/prostoy-kod-hemminga-praktika\/",
            "title": "Простой код Хэмминга. Практика.",
            "content_html": "<p>ВНИМАНИЕ! Это разжёванная версия замечательной статьи, которая есть на <a href=\"http:\/\/habrahabr.ru\/post\/140611\/\">хабре<\/a>!<br \/>\nЕсли вам нужно лаконичное объяснение, то вам туда! Если же вы в этом ничего не понимаете и требуется пошаговое разбирательство, то милости прошу читать дальше. То есть, где вам понятнее — там и читайте. Статья на <a href=\"http:\/\/habrahabr.ru\/post\/140611\/\">хабре<\/a> не моя, но я считаю, что она шикарна!<\/p>\n<p>Итак. Задача. Использовать код Хэмминга для двоичного сообщения, длина слова у которого составляет 16 бит. Исходное сообщение возьмём такое «0100010000111101». То есть в слове 16 «букв», каждая из которых может принимать значение либо «0», либо «1».<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/boyarkirk.ru\/pictures\/_023.jpg\" width=\"695\" height=\"43\" alt=\"\" \/>\n<\/div>\n<h2>Кодирование<\/h2>\n<p>Сначала в исходное сообщение добавляем контрольные биты и устанавливаем их в нуль.<br \/>\nКонтрольные биты располагаются в тех номерах битов, которые равны степеням двойки (ибо алфавит двоичный).<br \/>\nТо есть. Два в степени нуль — это единица, два в степени 1 = два, два в степени 2 = четыре, а два в степени 3 = восемь, два в степени 4 = 16<br \/>\nЗначит контрольные биты будут находиться в «буквах»(битах) под номерами 1, 2, 4, 8 и 16.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/boyarkirk.ru\/pictures\/_024.jpg\" width=\"692\" height=\"37\" alt=\"\" \/>\n<\/div>\n<p>В остальные номера бит переписываем исходное сообщение.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/boyarkirk.ru\/pictures\/_025.jpg\" width=\"694\" height=\"38\" alt=\"\" \/>\n<\/div>\n<p>Видно, что длина «слова» из-за такой избыточности увеличилась на пять «букв». В данном случае, конечно. У вас количество дополнительных бит будет зависеть от длины исходного «слова».<\/p>\n<p>Теперь нужно вычислить эти контрольные биты.<br \/>\nКаждый контрольный бит с номером N «контролирует»  непрерывную последовательность из N битов, через каждые N битов.<\/p>\n<p>Вот на картинке отмечено иксами (X), какие биты нужно использовать для вычисления первого контрольного бита (с номером «1»)<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/boyarkirk.ru\/pictures\/_027.jpg\" width=\"694\" height=\"54\" alt=\"\" \/>\n<\/div>\n<p>Для вычисления контрольно бита нужно просто сложить все «буквы» нашего «слова», которые он контролирует, а затем принять нелёгкое решение: если сумма получилась чётная, то пишем в результате нуль, а если нечётная — единицу.<\/p>\n<p>Вычисляем <b>первый бит<\/b>.<br \/>\nСкладываем биты под номерами 3,5,7,9,11,13,15,17,19,21<br \/>\nЭто будет 0 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 = 1 + 1 + 1 + 1 + 1 = 5<br \/>\nПолучилось 5 (пять). Сумма нечётная (на два нацело не делится). Значит пишем в первый бит единицу:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/boyarkirk.ru\/pictures\/_028.jpg\" width=\"690\" height=\"54\" alt=\"\" \/>\n<\/div>\n<p>Теперь вычислим контрольный <b>бит номер 2<\/b>.  Для него нужно будет найти сумму каждых двух бит следующих друг за другом непрерывно, через каждые два бита. Такие биты я тоже отметил на картинке.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/boyarkirk.ru\/pictures\/_029.jpg\" width=\"692\" height=\"54\" alt=\"\" \/>\n<\/div>\n<p>То есть будем теперь суммировать биты, начитая с третьего по номеру, и далее те, которые отмечены иксом (X).<br \/>\nИх номера 3, 6, 7, 10, 11, 14, 15, 18, 19.<br \/>\nЭто будет 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 = 4<br \/>\nЧетыре — число чётное, значит оставляем в нашем втором бите нуль.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/boyarkirk.ru\/pictures\/_030.jpg\" width=\"693\" height=\"40\" alt=\"\" \/>\n<\/div>\n<p>Переходим к вычислению <b>третьего контрольного бита<\/b>. Но это у нас он контрольный — третий. А в сообщении этот бит записан под <b>номером 4<\/b> — четыре.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/boyarkirk.ru\/pictures\/_031.jpg\" width=\"689\" height=\"55\" alt=\"\" \/>\n<\/div>\n<p>Значит и использовать будем все попадающие под наше правило биты, начиная с пятого.<br \/>\nА это биты под номерами 5, 6, 7, 12, 13, 14, 15, 20, 21.<br \/>\nСкладываем их: 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 = 3<br \/>\nВ итоге у нас нечётное число, значит пишем в наш контрольный бит единицу.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/boyarkirk.ru\/pictures\/_032.jpg\" width=\"691\" height=\"38\" alt=\"\" \/>\n<\/div>\n<p>Осталось всего ничего — <b>вычислить два оставшихся контрольных бита<\/b>, которые под номерами 8 и 16.<\/p>\n<p>В восьмом оставляем нуль потому, что в той последовательности, которую мы используем для вычисления присутствуют две единицы, дающие в сумме чётное число.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/boyarkirk.ru\/pictures\/_033.jpg\" width=\"691\" height=\"53\" alt=\"\" \/>\n<\/div>\n<p>А в 16-м тоже сумма бит получается чётной — оставляем нуль:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/boyarkirk.ru\/pictures\/_035.jpg\" width=\"692\" height=\"52\" alt=\"\" \/>\n<\/div>\n<p>В итоге мы получили слово с кодом Хэмминга, которое содержит избыточные биты (в сумме 21): «100110000100001011101».<\/p>\n<h2>Декодирование<\/h2>\n<p>А теперь представим, что к нам пришло сообщение с ошибкой. Вот оно «100110001100001011101».<br \/>\nМы знаем, что в него добавлены избыточные биты по алгоритму Хемминга, и нам надо проверить, есть в нём ошибка или нет.<\/p>\n<p>Для этого нужно поступить следующим образом. Сначала вычисляем заново все контрольные биты по предыдущему алгоритму.<br \/>\nДля этого сначала обнуляем все биты, находящиеся на номерах степеней двойки:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/boyarkirk.ru\/pictures\/_036.jpg\" width=\"691\" height=\"41\" alt=\"\" \/>\n<\/div>\n<p>В первом оставляем нуль, ибо в подконтрольных битах чётное число единиц.<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/boyarkirk.ru\/pictures\/_038.jpg\" width=\"693\" height=\"52\" alt=\"\" \/>\n<\/div>\n<p>Вычисляем все остальные контрольные биты по описанному выше алгоритму (мне лень заново его описывать тут), и получаем, что не совпадают контрольные биты под номерами 1 и 8:<\/p>\n<div class=\"e2-text-picture\">\n<img src=\"https:\/\/boyarkirk.ru\/pictures\/_039.jpg\" width=\"847\" height=\"54\" alt=\"\" \/>\n<\/div>\n<p>Теперь складываем номера этих контрольных бит: 1 + 8, и получаем 9 — номер бита, в котором закралась ошибка! Ура! Теперь просто меняем девятый бит на обратный — с единицы на нуль, — и получаем исходное сообщение!<\/p>\n<p>Отметим, что это самый простейший алгоритм Хемминга, который может исправить только одну ошибку в слове. Об остальных алгоритмах данная статья умалчивает. :)<\/p>\n",
            "date_published": "2015-12-30T04:55:22+00:00",
            "date_modified": "2016-09-09T08:31:00+00:00",
            "image": "https:\/\/boyarkirk.ru\/pictures\/_023.jpg",
            "_date_published_rfc2822": "Wed, 30 Dec 2015 04:55:22 +0000",
            "_rss_guid_is_permalink": "true",
            "_rss_guid": "https:\/\/boyarkirk.ru\/?go=all\/prostoy-kod-hemminga-praktika\/",
            "_e2_data": {
                "is_favourite": false,
                "links_required": [],
                "og_images": [
                    "https:\/\/boyarkirk.ru\/pictures\/_023.jpg",
                    "https:\/\/boyarkirk.ru\/pictures\/_024.jpg",
                    "https:\/\/boyarkirk.ru\/pictures\/_025.jpg",
                    "https:\/\/boyarkirk.ru\/pictures\/_027.jpg",
                    "https:\/\/boyarkirk.ru\/pictures\/_028.jpg",
                    "https:\/\/boyarkirk.ru\/pictures\/_029.jpg",
                    "https:\/\/boyarkirk.ru\/pictures\/_030.jpg",
                    "https:\/\/boyarkirk.ru\/pictures\/_031.jpg",
                    "https:\/\/boyarkirk.ru\/pictures\/_032.jpg",
                    "https:\/\/boyarkirk.ru\/pictures\/_033.jpg",
                    "https:\/\/boyarkirk.ru\/pictures\/_035.jpg",
                    "https:\/\/boyarkirk.ru\/pictures\/_036.jpg",
                    "https:\/\/boyarkirk.ru\/pictures\/_038.jpg",
                    "https:\/\/boyarkirk.ru\/pictures\/_039.jpg"
                ]
            }
        }
    ],
    "_e2_version": 3254,
    "_e2_ua_string": "E2 (v3254; Aegea)"
}