Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Деление 4-х байтовых чисел 
:(
    Опции темы
MarshallM
Дата 4.3.2009, 05:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 4.3.2009

Репутация: нет
Всего: нет



Добрый день форумчане!!!
Возникла у меня необходимость программирования контроллера.
На вход поступают 2 четырех-байтовых числа
Пусть будет int A[4]; int B[4]
Делимое и делитель соответсвенно.
Результатом должно явиться целое от деление + остаток.
При этом деление должно происходить столбиком, т.к. дополнительные библиотеки не подключаются, т.е. / и % нельзя использовать.
Возможно тема обсуждалась, поиском пользовался в течении часа, нужного не нашел. А Си помнится только со времен института))) Давно все это было))) И то, за этот период мозг уже успел подпортится 1С, прошу сильно не пинать)))
PM MAIL   Вверх
Albor
Дата 4.3.2009, 06:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 589
Регистрация: 28.2.2009

Репутация: нет
Всего: 9



Дык, нужно вспомнить Булевую алгебру и без всякого столбика выполнить деление. 
PS Обычно, если int 32-разрядный, int A[4] - это 16 байт, так как это массив из 4х int 
PM MAIL ICQ   Вверх
azesmcar
Дата 4.3.2009, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



как уже сказано выше - это массив из 32х разрядных чисел. И насчет булевой алгебры точно сказано..могу добавить ссылки

http://www.helpwithpcs.com/courses/multipl...ary-numbers.htm
http://www.binarymath.info/multiplication-division.php
PM   Вверх
MarshallM
Дата 4.3.2009, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 4.3.2009

Репутация: нет
Всего: нет



Albor, точно... в попыках печатал сообщение. это действительно массив из 32х битных чисел. прошу прощение за некорректность вопроса. Булеву алгебру помню)))
Приведу пример:
Имеем А={1,2,3,4}; Число 1234
Имеем В={1,2,3}; Число 123
Нужно организовать деление 1234 на 123 используя только вычитание.
Т.к. прошивка микропроцессора настолько слаба, что команда printf() подвешивает его на ООООчень продолжительный период времени(((
Осталось дело за малым... реализовать данную функцию на С. Есть у кого соображения?
PM MAIL   Вверх
math64
Дата 4.3.2009, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Обычно с компилятором для микропроцесса идут исходники для всех математических библиотек, используемых в нём (большей частью написанные на ассемблере). Нужно выкусить из них только нужные тебе алгоритмы - это будет работать быстрее, чем вручную писать то же самое на C.
PM   Вверх
vinter
Дата 4.3.2009, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



Цитата(MarshallM @  4.3.2009,  10:03 Найти цитируемый пост)
Нужно организовать деление 1234 на 123 используя только вычитание.

в чем проблема? вычитаешь 123 из 1234, пока результат не будет меньше 123, в то же время инкрементишь счетчик. Результат будет остатком, счетчик - целая часть.


--------------------
Мой блог
PM MAIL WWW   Вверх
MarshallM
Дата 4.3.2009, 09:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 4.3.2009

Репутация: нет
Всего: нет



math64, ассемблеровский код есть, проблема в том, что все ост. реализуемые МП функции написаны на С. И дополнительно прошивать компилятор асма не айс, хотелось бы иметь код именно на С. Но вижу что это не совсем просто. Я алгоритм рисовал только втечении дня и то не до конца... слишком сложно все это рационализировать.

Добавлено через 2 минуты и 39 секунд
vinter, а если наоборот 123 делим на 1234 (возможно и такая ситуация), ладно 0 я получил, а дальше? из 12300 вычитать 1234, в принципе логично, но вот стоит проблема реализации сего на С. Но большое спасибо все равно!!! В голове стало намного ясней!
PM MAIL   Вверх
MarshallM
Дата 4.3.2009, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 4.3.2009

Репутация: нет
Всего: нет



Вообщем ребята условия задачи несколько поменялись. Переменные имеют тип CHAR и занимают по 1 байту.
Т.е. имеем массив char a[4] - 4 байта. и начинаются танцы с бубном вокруг разрядов, заема единичек и прочей хрени, короче деление столбиком. Надеюсь сейчас выразился яснее...
PM MAIL   Вверх
ksili
Дата 4.3.2009, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



MarshallM, какой должен быть результат? Частное и целый остаток? или только частное? Или вещественный результат? Если вещественный то до какого разряда после запятой считать?

Если частное и целый остаток, то 
Цитата(vinter @  4.3.2009,  13:31 Найти цитируемый пост)
вычитаешь 123 из 1234, пока результат не будет меньше 123, в то же время инкрементишь счетчик. Результат будет остатком, счетчик - целая часть.

 
при этом 
Цитата(MarshallM @  4.3.2009,  13:31 Найти цитируемый пост)
если наоборот 123 делим на 1234

то частное = 0, а остаток = делимое

Добавлено @ 10:08
Цитата(MarshallM @  4.3.2009,  13:56 Найти цитируемый пост)
Переменные имеют тип CHAR и занимают по 1 байту.

значит сначала конвертнём наши массивы в целые числа:
Код

int delimoe = 1000*a[0] + 100*a[1] + 10*a[2] + a[3];
int delitel = 1000*b[0] + 100*b[1] + 10*b[2] + b[3];

индексы может и наоборот будут, я не знаю в каком порядке ты разряды передаешь

А если в char'e не готовое значение разряда, а символьная запись цифры, то вместо a[x] подставляем (a[x] - '0')

Это сообщение отредактировал(а) ksili - 4.3.2009, 10:10


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
MarshallM
Дата 4.3.2009, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 4.3.2009

Репутация: нет
Всего: нет



ksili, смею огорчить тем, что оперировать с переменными типа int и выше я не могу в силу специфики микропроцессора. Максимально хранимая единица памяти имеет значение 1 байт. Т.е. даже при всем желании в ячейку памяти я не смогу запихать четырех байтовое число. А получить в конце мне надо целое число и остаток от деления (опять же в виде массива 1 байтовых "слов").

Это сообщение отредактировал(а) MarshallM - 4.3.2009, 10:25
PM MAIL   Вверх
ksili
Дата 4.3.2009, 10:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Цитата(MarshallM @  4.3.2009,  14:24 Найти цитируемый пост)
ksili, смею огорчить тем, что 

с этого и надо было начинать...

Добавлено через 1 минуту и 8 секунд
тогда действительно получается деление в столбик  smile 


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
MarshallM
Дата 4.3.2009, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 4.3.2009

Репутация: нет
Всего: нет



ksili, значит возвращаемся к нашим баранам))) Есть ли у кого-нибудь алгоритм деления в столбик, реализованный на Си???
PM MAIL   Вверх
chaos
Дата 4.3.2009, 11:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Серийный программист
****


Профиль
Группа: Завсегдатай
Сообщений: 2979
Регистрация: 7.7.2004
Где: Екатеринбург

Репутация: 6
Всего: 44



MarshallM, а как интересно должен работать алгоритм деления в столбик если маск память под переменнную 1 байт? smile
хорошо если значения меньше 255 а если больше то тогда как?



ЗЫ что то мне подсказывает что деление столбиком не поможет smile

Это сообщение отредактировал(а) chaos - 4.3.2009, 11:05
PM WWW   Вверх
MarshallM
Дата 4.3.2009, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 4.3.2009

Репутация: нет
Всего: нет



chaos, ну допустим пусть будет доп условие, что число, составляющее массив А больше числа массива В. Иначе тупо получим 0 без остатка. Теперь по-моему все условия названы, господа программисты!!! Задачка на смекалку)))
PM MAIL   Вверх
vinter
Дата 4.3.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

Репутация: 13
Всего: 56



MarshallM, хочешь готовое - иди в центр помощи


--------------------
Мой блог
PM MAIL WWW   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0581 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.