![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| MarshallM |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 4.3.2009 Репутация: нет Всего: нет |
Добрый день форумчане!!!
Возникла у меня необходимость программирования контроллера. На вход поступают 2 четырех-байтовых числа Пусть будет int A[4]; int B[4] Делимое и делитель соответсвенно. Результатом должно явиться целое от деление + остаток. При этом деление должно происходить столбиком, т.к. дополнительные библиотеки не подключаются, т.е. / и % нельзя использовать. Возможно тема обсуждалась, поиском пользовался в течении часа, нужного не нашел. А Си помнится только со времен института))) Давно все это было))) И то, за этот период мозг уже успел подпортится 1С, прошу сильно не пинать))) |
|||
|
||||
| Albor |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: нет Всего: 9 |
Дык, нужно вспомнить Булевую алгебру и без всякого столбика выполнить деление.
PS Обычно, если int 32-разрядный, int A[4] - это 16 байт, так как это массив из 4х int |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
как уже сказано выше - это массив из 32х разрядных чисел. И насчет булевой алгебры точно сказано..могу добавить ссылки
http://www.helpwithpcs.com/courses/multipl...ary-numbers.htm http://www.binarymath.info/multiplication-division.php |
|||
|
||||
| MarshallM |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 4.3.2009 Репутация: нет Всего: нет |
Albor, точно... в попыках печатал сообщение. это действительно массив из 32х битных чисел. прошу прощение за некорректность вопроса. Булеву алгебру помню)))
Приведу пример: Имеем А={1,2,3,4}; Число 1234 Имеем В={1,2,3}; Число 123 Нужно организовать деление 1234 на 123 используя только вычитание. Т.к. прошивка микропроцессора настолько слаба, что команда printf() подвешивает его на ООООчень продолжительный период времени((( Осталось дело за малым... реализовать данную функцию на С. Есть у кого соображения? |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Обычно с компилятором для микропроцесса идут исходники для всех математических библиотек, используемых в нём (большей частью написанные на ассемблере). Нужно выкусить из них только нужные тебе алгоритмы - это будет работать быстрее, чем вручную писать то же самое на C.
|
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
||||
|
||||
| MarshallM |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 4.3.2009 Репутация: нет Всего: нет |
math64, ассемблеровский код есть, проблема в том, что все ост. реализуемые МП функции написаны на С. И дополнительно прошивать компилятор асма не айс, хотелось бы иметь код именно на С. Но вижу что это не совсем просто. Я алгоритм рисовал только втечении дня и то не до конца... слишком сложно все это рационализировать.
Добавлено через 2 минуты и 39 секунд vinter, а если наоборот 123 делим на 1234 (возможно и такая ситуация), ладно 0 я получил, а дальше? из 12300 вычитать 1234, в принципе логично, но вот стоит проблема реализации сего на С. Но большое спасибо все равно!!! В голове стало намного ясней! |
|||
|
||||
| MarshallM |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 4.3.2009 Репутация: нет Всего: нет |
Вообщем ребята условия задачи несколько поменялись. Переменные имеют тип CHAR и занимают по 1 байту.
Т.е. имеем массив char a[4] - 4 байта. и начинаются танцы с бубном вокруг разрядов, заема единичек и прочей хрени, короче деление столбиком. Надеюсь сейчас выразился яснее... |
|||
|
||||
| ksili |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
MarshallM, какой должен быть результат? Частное и целый остаток? или только частное? Или вещественный результат? Если вещественный то до какого разряда после запятой считать?
Если частное и целый остаток, то
при этом то частное = 0, а остаток = делимое Добавлено @ 10:08 значит сначала конвертнём наши массивы в целые числа:
индексы может и наоборот будут, я не знаю в каком порядке ты разряды передаешь А если в char'e не готовое значение разряда, а символьная запись цифры, то вместо a[x] подставляем (a[x] - '0') Это сообщение отредактировал(а) ksili - 4.3.2009, 10:10 -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
||||
|
|||||
| MarshallM |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 4.3.2009 Репутация: нет Всего: нет |
ksili, смею огорчить тем, что оперировать с переменными типа int и выше я не могу в силу специфики микропроцессора. Максимально хранимая единица памяти имеет значение 1 байт. Т.е. даже при всем желании в ячейку памяти я не смогу запихать четырех байтовое число. А получить в конце мне надо целое число и остаток от деления (опять же в виде массива 1 байтовых "слов").
Это сообщение отредактировал(а) MarshallM - 4.3.2009, 10:25 |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
с этого и надо было начинать... Добавлено через 1 минуту и 8 секунд тогда действительно получается деление в столбик -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| MarshallM |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 4.3.2009 Репутация: нет Всего: нет |
ksili, значит возвращаемся к нашим баранам))) Есть ли у кого-нибудь алгоритм деления в столбик, реализованный на Си???
|
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
MarshallM, а как интересно должен работать алгоритм деления в столбик если маск память под переменнную 1 байт?
хорошо если значения меньше 255 а если больше то тогда как? ЗЫ что то мне подсказывает что деление столбиком не поможет Это сообщение отредактировал(а) chaos - 4.3.2009, 11:05 |
|||
|
||||
| MarshallM |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 4.3.2009 Репутация: нет Всего: нет |
chaos, ну допустим пусть будет доп условие, что число, составляющее массив А больше числа массива В. Иначе тупо получим 0 без остатка. Теперь по-моему все условия названы, господа программисты!!! Задачка на смекалку)))
|
|||
|
||||
| vinter |
|
|||
![]() Explorer ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2735 Регистрация: 1.4.2006 Где: Н.Новгород Репутация: 13 Всего: 56 |
MarshallM, хочешь готовое - иди в центр помощи
|
|||
|
||||
| MarshallM |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 4.3.2009 Репутация: нет Всего: нет |
vinter, нет, готовое не хочу))) Хочу помощи в алгоритме, язык то вспомнить это ерунда. Голова на месте...
|
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 9 Всего: 59 |
Может это поможет: Деление двоичных чисел в столбик |
|||
|
||||
| Albor |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 589 Регистрация: 28.2.2009 Репутация: нет Всего: 9 |
Как вариант, можно организовать последовательное вычитание делителя из делимого, как уже предлогалось. Из байта вычесть байт мы можем, можем организовать -1 в байте выше по старшинству в случае отрицательного результата, можем последовательно сравнить, на предмет остатка, начиная со старшего байта. Итог: задача вполне решаема, нужно только потратить какоето количество времени.
|
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
При делении столбиком понадобятся алгоритмы вычитания, сранения, умножения на однозначное число. Как они у тебя реализованы?
Как удобнее передавать параметры? Возможно их передавать через такой стек:
|
|||
|
||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Ну очень специфичный микропроцессор
|
||||||
|
|||||||
| MarshallM |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 4.3.2009 Репутация: нет Всего: нет |
xvr, МП и на самом деле весьма специфичный, поэтому вопрос и стоит так коряво, самого аж накаляет... Ну как бы так и не иначе. Пусть переменная типа int и может хранится в четрых ячейках памяти, но оперировать числом как единым целым я опять же не смогу. В дынный момент смогу лишь прочесть все числа из памяти последовательно. Сохранить полученное число типа int мне просто некуда, поэтому и оперирую именно цифрами конкретного четырех байтового числа.
Неее велосипед я не изобретаю))) Albor, знаю что задача вполне решаема, и уже практически за вчерашний вечер реализовал. Получается конечно вырезание гланд через ...., но вроде результат близок))) Всем спасибо! |
|||
|
||||
| xvr |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Почему? Компилятор может, а вам что мешает?
|
||||||||
|
|||||||||
| MarshallM |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 4.3.2009 Репутация: нет Всего: нет |
xvr, а если я добью это все дело таким танцем)))
Команда printf подвешивает МП компилируя код на долгий промежуток времени, каким образом она отнесется к операциям с переменными типа long??? Как считаете? |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Ваш компилятор должен поддерживать работу по крайней мере с 16-разрядными числами. 8-разрядные указатели - это слишком мало. Ho он может считать long 16 разрядным (я не знаю какой у Вас процессор)
printf подвешивает компилятор скорее всего потому, что у него параметры переменной длины. пользуйтесь itoa() и atoi() для перевода числа в текстовое представление или наоборот. |
|||
|
||||
| xvr |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 60 Всего: 223 |
Команда printf занимается кучей работы по форматированию и выводу. К умножению long'ов сие никакого отношения не имеет
Огласите, пожалуйста, нафига вам это (умножение 32х битных чисел) надо и почему не устраивает то, что есть в компиляторе? |
||||||
|
|||||||
| MarshallM |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 4.3.2009 Репутация: нет Всего: нет |
вот с этим я не поспорю))) |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
а может топик стартеру стоит озвучить что за процессор такой?!
Добавлено через 12 минут и 40 секунд а вообще попахивает каким-то курсовым проектом - извращенец-препод придумал задачку, которую поди сам не решил даже Это сообщение отредактировал(а) chaos - 6.3.2009, 14:40 |
|||
|
||||
| MarshallM |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 4.3.2009 Репутация: нет Всего: нет |
МП 6502 - самый простой. Все таки при объявлении переменной типа int наступает тишинаааа....)))
Попахивает курсовым))) Что самое интересное, что мне бы наверное так же показалось бы. |
|||
|
||||
| chaos |
|
|||
![]() Серийный программист ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2979 Регистрация: 7.7.2004 Где: Екатеринбург Репутация: 6 Всего: 44 |
||||
|
||||
| MarshallM |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 4.3.2009 Репутация: нет Всего: нет |
chaos,
|
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
MarshallM, если вы согласны, что деление - это многократное вычитание, то здесь всё очень подробно расписано как реализовать чудеснейший алгоритм вычитания.
http://nekin.narod.ru/math/m0009.htm |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |