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

Привет 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) =-

Reply to
Aleksandr Butko
Loading thread data ...

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...

Reply to
Vadik Akimoff

Привет 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) =-

Reply to
Aleksandr Butko

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

Reply to
Anatoly Mashanov

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

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

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

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

Георгий

Reply to
George Shepelev

Hi!

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

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

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

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

Bye...

Reply to
Vadik Akimoff

Привет 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) =-

Reply to
Aleksandr Butko

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...

Reply to
Vadik Akimoff

Привет 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) =-

Reply to
Aleksandr Butko
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,

Reply to
Oleksandr Redchuk

Привет 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) =-

Reply to
Aleksandr Butko

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.