![]() |
|
![]() ![]() ![]() |
|
Matrex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 31.1.2006 Репутация: нет Всего: 2 |
Коллеги, помогите с алгоритмом функции, для получения значения разряда десятичного числа. Т.е.
myinttostr(235,0) результат =5 myinttostr(235,1) результат =3 myinttostr(235,2) результат =2 Проблема в том, что допускается использовать только операторы +, -, if, goto, and, xor, or и операции сдвига. Да, это не задача для ВУЗа - в последующем этот алгоритм будет адаптирован к ассемблеру микроконтроллера PIC16F84 – поэтому такие ограничения по операциям. |
|||
|
||||
Pavia |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 418 Регистрация: 6.12.2008 Репутация: 11 Всего: 12 |
А сразу хранить числа в 10 формате
![]() Алгоритм простой b:=a/10; делем на цело с:=a-b*10 получаем остаток goto к следующему разряду деление на константу легко заменяется на умножение сдвиги и сложения. Алгоритм лучше прочитать у Агнера Фога. Просто он у него он полностью расписан. http://www.agner.org/optimize/optimizing_assembly.pdf |
|||
|
||||
Matrex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 31.1.2006 Репутация: нет Всего: 2 |
В десятичном формате работать нельзя т.к. это полностью меняет алгоритм работы всего приложения.
По поводу Агнера Фога - он использует уножение... Правда умножение можно заменить сложением... Будем посмотреть... А есть другие соображения? |
|||
|
||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
А объём дополнительной памяти? критично?
В крайнем случае нечто типа решения "влоб":
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Matrex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 31.1.2006 Репутация: нет Всего: 2 |
Насчет памяти для конкретно этого приложения не критично, поэтому решение "в лоб" допустимо. Я о чем то подобном думал – такая реализация относится к категории «от отчаяния»
![]() Все таки должно быт простое оригинальное решение т.к. подобная задача должна же была как то решаться на слабых процессорах в которых нет деления и умножения (например Z80, и легендарный Spectrum) |
|||
|
||||
maxim1000 |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
числа 1, 10, 100, 1000, ... можно сохранить в памяти на этапе сборки
потом можно узнавать старшую цифру так:
тогда раскладывать число на цифры можно так:
если захочется немножко ускорить, можно добавить один шаг деления пополам: перед поиском цифры быстро определить больше ли она 5, дальше бисекция много ускорения не даст... -------------------- qqq |
||||
|
|||||
Akina |
|
|||
Советчик ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 20581 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 20 Всего: 454 |
Я вообще-то эти вещи не связывал... как я понял, десятичную цифру надо выделять из байта? тогда можно подготовить 3 статических таблицы (или построить эти таблицы при старте прошивки/приложения) и находить ответ одним XLAT. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Matrex |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 96 Регистрация: 31.1.2006 Репутация: нет Всего: 2 |
Всем спасибо за советы. Вот нашел в своих старых asm проектах и переделал на Delphi (для наглядности). Реалезация похожа на то что предложил maxim1000:
Это сообщение отредактировал(а) Matrex - 7.4.2009, 08:45 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Алгоритмы" | |
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Алгоритмы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |