[an error occurred while processing this directive] [an error occurred while processing this directive]
Все просто
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)
[an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive]

Отправлено Voldemar 11 сентября 2001 г. 01:22
В ответ на: Здорово, хотя и не понятно, почему работает (+) отправлено kV 10 сентября 2001 г. 20:03

Выполняется пересылка двоичного числа из двоичного регистра в двоично-десятичный путем последовательности сдвигов. Сдвиг числа эквивалентен его умножению на 2. Для двоично десятичного числа - это умножение каждой тетрады на 2 и прибавление переноса из предыдущей тетрады. Если в тетраде записана десятичноая цифра 0..4, то после сдвига ее значение станет (в зависимости от переноса из предыдущей тетрады) 0..9, все соответствует двоично-десятичной арифметике. Если же тетрада содержит цифру 5, то после сдвига значение тетрады должно стать равным нулю и произойти перенос в следующую тетраду, т.е 5 после сдвига должна превратиться в шестнацатеричное число 0х10, а это можно получить, если перед сдвигом превратить ее в 8, т.е. прибавить 3. Аналогично с цифрами 6 - 9.

Кстати в алгоритме Baser небольшая неточность, количество сдвигов равно количеству двоичных разрядов, а не до тех пор пока исходное двоичное число не станет равным нулю (если я правильно перевел).

Иногда выгодно каждую BCD тетраду держать в отдельном байте, например, для получения числа в виде строки ASCII в этом случае после преобразования достаточно к каждому байту прибавить 0х30.
В этом случае перед сдвигом, если цифра больше 4, нужно прибавлять не 3, а 123 (0x7B).

Ускорение алгоритма - не выполнять проверку и коррекцию тетрад пока в BCD-регистр не войдет первая единица. При малых значениях исходного числа преобразование будет происходить значительно быстрее.

Алгоритм можно расширить для преобразования числа с плавающей точкой без использования деления и умножения. Для маленьких индикаторов хорошая замена для Сишного sprintf.


Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru