[an error occurred while processing this directive]
[an error occurred while processing this directive]
|
Выполняется пересылка двоичного числа из двоичного регистра в двоично-десятичный путем последовательности сдвигов. Сдвиг числа эквивалентен его умножению на 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