Десятичная коррекция

Feb 09, 2005 12 Replies

Привет All!



Hе могу сообразить :-(



Задача такая: разложить HEX от 00 00 00h до 01 38 38 в десятичном виде



от 00 00 00 00 00 до 08 00 00 00 00



пример:



mem+0 = 01h mem+1 = 00h mem+2 = 00h



т.е. число 65536



нужно разложить в 5 ячеек mem+3 = 06h mem+4 = 05h mem+5 = 05h mem+6 = 03h mem+7 = 06h



Может есть готовые примеры?



Всего хорошего. Aleksandr -= Tehinform (2:4651/25.45) =-


Hi!

In a message of 09 Feb 05 Aleksandr Butko wrote to All:

AB> Задача такая: разложить HEX от 00 00 00h до 01 38 38 в десятичном виде

AB> от 00 00 00 00 00 до 08 00 00 00 00 [skip] AB> Может есть готовые примеры?

Примеры - вряд ли, но советы... =)

Самый простой способ: завести табличку чисел 10000,1000,100,10 в 3байтном хексе. Потом из заданного числа вычитаешь 10000 и считаешь, сколько раз вычтется. Это будет старшая цифра. Потом из того, что осталось, вычитаешь

1000. И так далее. Под конец, когда вычтешь десятки, останутся сразу единицы.

Bye...

Привет Vadik!

Среда Февраль 09 2005, Vadik Akimoff писал к Aleksandr Butko:

AB>> Задача такая: разложить HEX от 00 00 00h до 01 38 38 в десятичном виде

AB>> от 00 00 00 00 00 до 08 00 00 00 00 VA> [skip] AB>> Может есть готовые примеры?

VA> Примеры - вряд ли, но советы... =)

VA> Самый простой способ: завести табличку чисел 10000,1000,100,10 в 3байтном VA> хексе. Потом из заданного числа вычитаешь 10000 и считаешь, сколько раз VA> вычтется. Это будет старшая цифра. Потом из того, что осталось, вычитаешь VA> 1000. И так далее. Под конец, когда вычтешь десятки, останутся сразу VA> единицы. Я об этом думал, но хотелось красивее.

Всего хорошего. Aleksandr -= Tehinform (2:4651/25.45) =-

Hello Aleksandr!

09 Feb 05 19:20, you wrote to All: аргумент AB> mem+0 = 01h AB> mem+1 = 00h AB> mem+2 = 00h AB> нужно разложить в 5 ячеек результат AB> mem+3 = 06h AB> mem+4 = 05h AB> mem+5 = 05h AB> mem+6 = 03h AB> mem+7 = 06h

Обнуляешь результат.

Дальше 24 повторения цикла: Умножаешь результат на 2 (Сдвигом влево) Если старший разряд аргумента = 1 то прибавляешь к результату 1 Умножаешь каждый байт аргумента на 2 (Тоже сдвигом влево побайтно, перенос не делаем, см ниже). Производишь десятичную коррекцию результата, то есть, если какая-то цифра больше 9, из нее надо вычесть 10 и к следующей старшей прибавить 1. Конец цикла.

Anatoly

Aleksandr, ты ещё здесь сидишь?

Среда Февраль 09 2005 22:24, Aleksandr Butko wrote to Vadik Akimoff:

VA>> Самый простой способ: завести табличку чисел 10000,1000,100,10 в VA>> 3байтном хексе. Потом из заданного числа вычитаешь 10000 и VA>> считаешь, сколько раз вычтется. Это будет старшая цифра. Потом из VA>> того, что осталось, вычитаешь 1000. И так далее. Под конец, когда VA>> вычтешь десятки, останутся сразу единицы. AB> Я об этом думал, но хотелось красивее.

Красивее будет, если в контроллере есть команда деления. А если нужно побыстрее вычислять, можно использовать "хакерские трюки", но код будет выглядеть ещё менее красиво...

Георгий

Hi!

In a message of 09 Feb 05 Aleksandr Butko wrote to me:

AB> Я об этом думал, но хотелось красивее.

А у тебя выбор ровно из 2 вариантов - в исходной системе (двоичной) делить на 10 и считать остатки (мой вариант), или в конечной системе (десятичной) прибавлять 2,4,8,16,32, ... etc. (вариант AM).

См. Кнута - там у него про переводы из систем в системы много понаписано.

Bye...

Привет George!

Пятница Февраль 11 2005, George Shepelev писал к Aleksandr Butko:

VA>>> Самый простой способ: завести табличку чисел 10000,1000,100,10 в VA>>> 3байтном хексе. Потом из заданного числа вычитаешь 10000 и VA>>> считаешь, сколько раз вычтется. Это будет старшая цифра. Потом из VA>>> того, что осталось, вычитаешь 1000. И так далее. Под конец, когда VA>>> вычтешь десятки, останутся сразу единицы. AB>> Я об этом думал, но хотелось красивее.

GS> Красивее будет, если в контроллере есть команда деления. А если Я в письме "в догонку" написал - 51-й контроллер.^^^^^^^^^^^^ GS> нужно побыстрее вычислять, можно использовать "хакерские трюки", GS> но код будет выглядеть ещё менее красиво...

Мне в голову пришла мысль такого плана d = x - ((x div 10) mul 10) (все операции целочисленные) и далее в цикле 5 раз (кол-во разрядов) со сдвигом. Hа следующих выходных поковыряюсь.

Всего хорошего. Aleksandr -= Tehinform (2:4651/25.45) =-

Hi!

In a message of 14 Feb 05 Aleksandr Butko wrote to George Shepelev:

AB> Мне в голову пришла мысль такого плана d = x - ((x div 10) mul 10) (все AB> операции целочисленные) и далее в цикле 5 раз (кол-во разрядов) со AB> сдвигом. Hа следующих выходных поковыряюсь.

И по-твоему делать 5 раз в полный рост на 10 с отстатком (двоичным столбиком - со всеми 17мя битами - для чисел от 0 до 99999) - это менее криво, чем 5 раз вычесть по несколько чисел?

AB> Я в письме "в догонку" написал - 51-й контроллер.^^^^^^^^^^^^

И деление придётся как раз сдвигами и вычитаниями делать - встроенная комадна 8/8=8 тебе не поможет. Так что если хочется изобрести делилку

24/8=16 - то изобретай. Или вычитай 10000,1000,100,10. Кстати, в этом случае вычитать из 24 бит нужно только 1 раз, остальное всё из 16 бит можно. Когда дойдёшь до десятков - можешь смело применить встроенную команду деления (1 раз) - число в байт уже уложится.

Bye...

Привет Vadik!

Вторник Февраль 15 2005, Vadik Akimoff писал к Aleksandr Butko:

AB>> Мне в голову пришла мысль такого плана d = x - ((x div 10) mul 10) (все AB>> операции целочисленные) и далее в цикле 5 раз (кол-во разрядов) со AB>> сдвигом. Hа следующих выходных поковыряюсь.

VA> И по-твоему делать 5 раз в полный рост на 10 с отстатком (двоичным VA> столбиком - со всеми 17мя битами - для чисел от 0 до 99999) - это менее VA> криво, чем 5 раз вычесть по несколько чисел?

AB>> Я в письме "в догонку" написал - 51-й контроллер.^^^^^^^^^^^^

VA> И деление придётся как раз сдвигами и вычитаниями делать - VA> встроенная комадна 8/8=8 тебе не поможет. Так что если хочется VA> изобрести делилку 24/8=16 - то изобретай. Или вычитай VA> 10000,1000,100,10. Кстати, в этом случае вычитать из 24 бит нужно только VA> 1 раз, остальное всё из 16 бит можно. Когда дойдёшь до десятков - VA> можешь смело применить встроенную команду деления (1 раз) - число в байт VA> уже уложится. Согласен, убедил. Хотя, скорость мне не очень критична. У меня ограничения на длину кода.

Всего хорошего. Aleksandr -= Tehinform (2:4651/25.45) =-

14-Feb-05 23:20 Aleksandr Butko wrote to George Shepelev:

AB> Мне в голову пришла мысль такого плана d = x - ((x div 10) mul 10) (все AB> операции целочисленные) и далее в цикле 5 раз (кол-во разрядов) со AB> сдвигом. Hа следующих выходных поковыряюсь.

Во-первых, аппаратный div у 51-го делит 8 бит на 8, для работы с 16-битными числами уже нужна относительно тормозная подпрограмма. С mul то же самое, но всё же там быстрее.

Во-вторых, там нужны только сдвиги и команда десятичной коррекции, всё преобразование займёт времени приблизительно столько же, как одно деление вычитанием и сдвигом. Я уже говорил, что кидал сюда исходники. Да, да, мне лень сейчас искать это по своим компактам и опять сюда постить, но ведь и тебе лень поискать в архивах эхи ;-)

wbr,

Привет Oleksandr!

Вторник Февраль 15 2005, Oleksandr Redchuk писал к Aleksandr Butko:

AB>> Мне в голову пришла мысль такого плана d = x - ((x div 10) mul 10) (все AB>> операции целочисленные) и далее в цикле 5 раз (кол-во разрядов) со AB>> сдвигом. Hа следующих выходных поковыряюсь.

OR> Во-первых, аппаратный div у 51-го делит 8 бит на 8, для работы с OR> 16-битными числами уже нужна относительно тормозная подпрограмма. С mul то OR> же самое, но всё же там быстрее.

OR> Во-вторых, там нужны только сдвиги и команда десятичной коррекции, OR> всё преобразование займёт времени приблизительно столько же, как одно OR> деление вычитанием и сдвигом. OR> Я уже говорил, что кидал сюда исходники. OR> Да, да, мне лень сейчас искать это по своим компактам и опять сюда OR> постить, но ведь и тебе лень поискать в архивах эхи ;-) А то! Лень раньше меня родилась Ж8-) ^^^^^^^^^^^^^^^^^^^

Всем спасибо за участие! Уже сделал вычитанием в цикле начиная с Х - 10000 с подсчетом кол-ва вычитаний и делением вычитаемого на 10. У меня гарантировано 5 ячеек, так что пять раз крутнулся и число разложено по ячейкам. Hа индикатор я вывожу.

Всего хорошего. Aleksandr -= Tehinform (2:4651/25.45) =-

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required