Авторизация


...

Кто на сайте?

Сейчас 92 гостей и ни одного зарегистрированного пользователя на сайте

Статистика

-Посетители : 24586
-Материалы : 210

Пользователь сайта продает...

  DUB-E100

Пользователь сайта покупает...

Особенности преобразования двоичного числа в двоично-десятичный код методом левого сдвига

Автор: Игорь Безверхний Просмотров: 13022

 

 

А вот на второй, не менее важный, вопрос («Почему именно так?») в этой статье ответа нет. Вообще, складывается впечатление, что этот писатель и сам не имеет четкого ответа на сей вопрос.

Надеюсь, что заинтересованный читатель найдет ответ на него в настоящей статье.

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

Напомню, что в большинстве МК используется двоичный код 8-4-2-1. Он сведен в таблицу 1. Все двоичные числа этой таблицы четырех разрядные, т.е. представляют собой тетрады.

Таблица 1. Двоичный код 8-4-2-1

 

 

 

С помощью кода 8-4-2-1 можно закодировать как 10 цифр десятичной системы счисления, так и все 16 шестнадцатеричной.

Обратите внимание на тетрады, выделенные серой заливкой. Эти тетрады для двоично-десятичного кода явно лишние. Их иногда называют запрещенными тетрадами или псевдотетрадами. При преобразовании двоичного кода в двоично-десятичный от них (псевдотетрад) надо грамотно избавляться. Это одна из проблем этого преобразования.

Ещё необходимо представлять, что сдвиг двоичного числа на один разряд (бит) влево эквивалентен умножению его на два.

Пример: 1010 0111 = 167
Сдвинем это двоичное число на бит влево и получим вдвое большее число: 1 0100 1110 = 334.

Вспомнив все это, мы готовы к дальнейшему изучению преобразования двоичного кода в двоично-десятичный методом левого сдвига.

При этом будем помнить, что двоично-десятичный код не должен содержать псевдотетрад (см. табл. 1), и то, что при этом преобразовании возникают проблемы с переносом 1 между тетрадами, каждая из которых – это один десятичный разряд.

Так, при переносе 1 из младшего двоично-десятичного разряда (тетрады) в следующий более старший (следующую тетраду), число «теряет» 6 единиц, т.к. весовой коэффициент этого разряда 10, а в двоичной и системе счисления (и шестнадцатеричной тоже) он равен 16. Следовательно, сдвигая число влево надо производить соответствующую коррекцию, чтобы получить правильный результат.

Возьмем произвольное восьмиразрядное двоичное число. Например: 11101101 (в десятичной системе оно равно 237, а шестнадцатеричной – EDh). Затем будем «вдвигать» это двоичное число справа налево, в так называемую, двоично-десятичную разрядную сетку, производя необходимую для преобразования коррекцию.

 

 

 

Первые три сдвига для этого числа можно сделать «безболезненно», без всякой коррекции. В младшие разряды двоично-десятичной сетки записалось число 7.
Следующий четвертый сдвиг его удвоит (вспомним, что левый сдвиг – это умножение на два): 1110 = 14
Получили запрещенную тетраду (псевдотетраду). Чтобы от псевдотетрады «избавиться», к ней надо добавить число 6 (110 в двоичной системе).
Проделаем эту операцию: 1110 + 110 = 10100. Вспомним, что полученное число – это не простое двоичное число, а двоично-десятичое число. Весовой коэффициент его старшего разряда не 16, а 10. Значит, двоично-десятичное число 10100 будет равно десятичному числу 14. Коррекция произведена.
На практике используется более удобный и универсальный способ коррекции. Суть его в том, коррекция осуществляется до четвертого сдвига, и то только тогда, когда это необходимо. Дело в том, что уже после третьего сдвига можно однозначно судить получится при следующем сдвиге псевдотетрада или нет. Напомню, что псевдотетрады возникают для чисел больших девяти. Это значит, если после третьего сдвига в трех младших разрядах будет двоичное число не больше чем 4 (100), то после следующего сдвига псевдотетрада не появится. Псевдотетрады возникнут тогда, когда перед четвертым сдвигом (т.е. перед очередным умножением на 2) в двоично-десятичной сетке будет любое число ≥5 (101), как в нашем случае было 7. Для осуществления коррекции перед четвертым сдвигом надо:

  1. Проверить число в трех младших разрядах двоично-десятичной сетки.
  2. Если оно меньше 5, то коррекцию не производить.
  3. Если оно ≥5 (101), то к нему надо добавить 3 (011).

Этот третий случай мы как раз и наблюдаем.
Продолжим, добавим тройку, и сделаем 4-й сдвиг.

 

 

 

Обратите внимание, в двоично-десятичной сетке после 4-го сдвига у нас появилось число 10100, т.е. тоже число 14, что и при добавлении 6 после четвертого сдвига при рассмотренном ранее способе коррекции.
Почему так происходит?
Ответ прост. При левом сдвиге происходит удвоение как корректируемого, так и корректирующего числа (3 × 2 = 6). С математической точки зрения способы равнозначны.
Производим 5-й сдвиг.

 

 

 

Обратите внимание, младшая тетрада двоично-десятичного числа равна 1001 = 9, что вполне допустимо. Само двоично-десятичное число 101001 = 29. При  следующем сдвиге без коррекции получится число  1010011 = 53, а должно быть 29 × 2 = 58. Откорректировать возникшую погрешность можно, если перед сдвигом добавить к сдвигаемому числу «волшебное число» 3.

 

Возникла новая ситуация. В младшей тетраде двоично-десятичного числа «расположилось» число 9 (1001), а в средней 5 (101), точнее 50 (см. весовые коэффициенты разрядов этой декады).
Это значит, перед следующим сдвигом надо делать коррекцию не только младшей тетрады, но и следующей средней. Для коррекции младшей тетрады к ней надо добавить 3, а для коррекции средней – 30, что и сделано ниже.

 

 

 

Теперь в младшей тетраде находится число 8 (1000), а, значит, при следующем (последнем) сдвиге и при отсутствии коррекции 1 перейдет в следующую тетраду в разряд с весовым коэффициентом 10, а не 16, как это было бы у обычного двоичного числа. Следовательно, перед 8-м сдвигом к младшей тетраде надо добавить 3.

 

 

 

 

Преобразование двоичного числа в двоично-десятичное закончено. Слева получен ожидаемый нами двоично-десятичный код десятичного трехразрядного числа 237
(10 0011 0111), но это на бумаге, в теории. В реальном микроконтроллере все выглядит похоже, но несколько иначе. Хотя бы потому, что четырехразрядных (четырехбитовых) регистров не существует и для каждого двоично-десятичного разряда выделяется полный регистр. Для МК PIC среднего семейства (и не только) он восьмиразрядный. В старшей тетраде этого регистра всегда должны быть нули (0000). Это несколько усложняет алгоритм преобразования.

Понимая все это, заметно проще разобраться в любой подпрограмме преобразования двоичного числа в двоично-десятичное методом левого сдвига.
Одна из лучших, на мой взгляд, таких подпрограмм – это универсальная подпрограмма Алексея Черепанова, которую можно найти здесь.

Случайные статьи....

Prev Next

Регулятор мощности для паяльника на PIC16F628A

29-04-2012 Alex

Регулятор мощности для паяльника на PIC16F628A

 Ниже представлена схема регулятора мощности для паяльника.   Основой схемы является микроконтроллер PIC16F628A. Схема, детали и их номиналы подбирались экспериментально и из того, что было под рукой.Блок питания на 5V я рисовать не стал, т.к. он у меня стандартный – трансформатор, диодный...

Видеоадаптер на PIC18F46K20

04-03-2011 Николай Викторов

Видеоадаптер на PIC18F46K20

  При разработке радиолюбительских устройств на микроконтроллерах (далее просто МК) иногда возникает необходимость в отображении информации на экране телевизора (монитора) .Какого либо стандартного устройства отвечающего по технических характеристикам найти не удалось, по этому возникла идея  создания  устройства , которое будет...

Что такое микроконтроллер?

21-04-2012 Super User

   Надеюсь, Вы не сильно утомились, читая про двоичную арифметику, логические операции и т.д., но что поделаешь? Без этого никуда. Дальше  переходим к рассмотрению следующей главы -микроконтроллеры …. Микроконтроллер – в первую очередь, это микросхема, да  и  на вид практически  ничем не...

Подключение ENC28J60 + PIC к локальной сети .

27-10-2011 Николай Викторов

Подключение ENC28J60 + PIC к локальной сети .

1 часть.   Эта статья будет интересна в первую очередь тем, кто пишет программы  для микроконтроллеров на ассемблере и есть желание  собрать устройство , работающие в локальной сети или сети ethernet. Здесь будет применена связка  ethernet контроллер  enc28j60 и PIC18F46K20. Но можно...


Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2017 © ChipMK.ru

ChipMk.ru Яндекс.Метрика
PRCY.ru