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

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Russian to

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


Re: Десятичная коррекция
Привет All!

В догонку. Извините, забыл про процессор. 51-й.


Re: Десятичная коррекция
9-Feb-05 20:00 Aleksandr Butko wrote to All:

AB> Привет All!
AB> В догонку. Извините, забыл про процессор. 51-й.

Я как минимум один раз кидал сюда код, как раз под 51-й, на асме,
для вызовов из-под кейла.

Поищи по архивам эхи.

wbr,

--
/* Oleksandr Redchuk, Brovary, Ukraine */
/* real '\x40' real '\x2E' kiev '\x2E' ua     */


Десятичная коррекция
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) =-


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

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


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

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

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


                                                   Георгий


Десятичная коррекция
Привет 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/816%  -  то  изобретай.   Или  вычитай 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/816%  -  то  изобретай.   Или  вычитай
 VA> 10000,1000,100,10.  Кстати, в этом случае вычитать из 24 бит нужно только
 VA> 1 раз, остальное всё из 16 бит можно. Когда  дойдёшь  до  десятков  -
 VA> можешь  смело  применить встроенную команду деления (1 раз) - число в байт
 VA> уже уложится.
Согласен, убедил. Хотя, скорость мне не очень критична. У меня ограничения на
длину кода.

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


Re: Десятичная коррекция
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 Redchuk, Brovary, Ukraine */
/* real '\x40' real '\x2E' kiev '\x2E' ua     */


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

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

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

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

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


Bye...


Re: Десятичная коррекция
Привет 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) =-


Десятичная коррекция
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


Site Timeline