Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, pullover, Вы писали:
P>>как вычислить остаток от деления на 10? Делить процессор не умееет, BCD тоже не поддерживает.
ДД>На ассемблере, что ли? C-компилятор успешно справляется с этой задачей вычитаниями.
да на ассемблере, C код я посмотрел — много циклов и дополнительных подпрограмм. может можно быстрее?
Здравствуйте, pullover, Вы писали:
P>да на ассемблере, C код я посмотрел — много циклов и дополнительных подпрограмм. может можно быстрее?
Если бы для общего случая можно было быстрее, думаю разработчики компилятора использовали бы этот способ.
Каков диапазон аргумента? Может можно обойтись таблицей.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Здравствуйте, ДимДимыч, Вы писали:
ДД>Здравствуйте, pullover, Вы писали:
P>>да на ассемблере, C код я посмотрел — много циклов и дополнительных подпрограмм. может можно быстрее?
ДД>Если бы для общего случая можно было быстрее, думаю разработчики компилятора использовали бы этот способ. ДД>Каков диапазон аргумента? Может можно обойтись таблицей.
разобрался в r16 исходное число
результат r16 единицы, r17 десятки..
Здравствуйте, pullover, Вы писали:
P>как вычислить остаток от деления на 10? Делить процессор не умееет, BCD тоже не поддерживает...
я бы делал наверное так.
писано на глаз
int mod (int value, int divider)
{
if (divider > value)
return value;
int shift = 1;
do
{
divider <<= 1;
shift++;
}
while (divider < value);
while (shift--)
{
if (value >= divider)
value -= divider;
divider >>= 1;
}
return value;
}
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Для определенных задач данный метод пойдет, но он имеет существенный недостаток: время вполнения линейно зависит от значения аргумента, где-то 6*N/10, т.е. уже для числа 100 это будет около 60 тактов. Ну если исключить подсчет частного, то 5*N/10.
Вообще в таких ситуациях необходимо рассматривать задачу более глобально: в чем (размер кода или скорость) требуется оптимизация и как будет использоваться результат. Если это например динамическая индикация на семисегментнике, то оптимальное решение может быть совсем другим.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Правила форума нарушены.
— оверквотинг
Правила можно найти в разделе FAQ данного форума и\или ресурса.
Нарушение правил может повлечь за собой санкции, описанные там же — модератор
ДД>Вообще в таких ситуациях необходимо рассматривать задачу более глобально: в чем (размер кода или скорость) требуется оптимизация и как будет использоваться результат. Если это например динамическая индикация на семисегментнике, то оптимальное решение может быть совсем другим.
согласен, но мне это подойдет — надо минуты, секунды отображать...
Здравствуйте, Sergei I. Gorelkin, Вы писали:
SIG>Чтобы "разделить" байт на 10, достаточно умножить его на 26 и взять старший байт: здесь.
подозреваю что умножения там тоже нет.
тем более ему нужен остаток
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Sergei I. Gorelkin, Вы писали:
SIG>Умножение на большинстве современных AVR (за исключением некоторых low-end моделей) имеется.
Разве что в тех, где есть аппаратный модуль умножения. Но умножение на константу в большинстве случаев можно заменить сдвигами и сложением, в данном случае коэффициенты 16, 8 и 2.
Обязательно бахнем! И не раз. Весь мир в труху! Но потом. (ДМБ)
Здравствуйте, Sergei I. Gorelkin, Вы писали:
SIG>Здравствуйте, pullover, Вы писали:
P>>как вычислить остаток от деления на 10? Делить процессор не умееет, BCD тоже не поддерживает...
SIG>Чтобы "разделить" байт на 10, достаточно умножить его на 26 и взять старший байт: здесь.
Ваша не правда (по сселке перейти не удалось):
для 38 чисел этот метод дает неправильный результат, попробуйте для 69.
Здравствуйте, VEAPUK, Вы писали:
SIG>>Чтобы "разделить" байт на 10, достаточно умножить его на 26 и взять старший байт: здесь. VEA>Ваша не правда (по сселке перейти не удалось): VEA>для 38 чисел этот метод дает неправильный результат, попробуйте для 69.
А я предлагаю умножить на 205 (256*8/10), взять старший байт и поделить на 8 (>>3).
Работает 100%.