Модераторы: 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   Вверх
MarshallM
Дата 4.3.2009, 11:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



vinter, нет, готовое не хочу))) Хочу помощи в алгоритме, язык то вспомнить это ерунда. Голова на месте...
PM MAIL   Вверх
Anikmar
Дата 4.3.2009, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(MarshallM @  4.3.2009,  11:34 Найти цитируемый пост)
vinter, нет, готовое не хочу))) Хочу помощи в алгоритме, язык то вспомнить это ерунда. Голова на месте... 


Может это поможет:
Деление двоичных чисел в столбик
PM MAIL ICQ   Вверх
Albor
Дата 4.3.2009, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как вариант, можно организовать последовательное вычитание делителя из делимого, как уже предлогалось. Из байта вычесть байт мы можем, можем организовать -1 в байте выше по старшинству в случае отрицательного результата, можем последовательно сравнить, на предмет остатка, начиная со старшего байта. Итог:  задача вполне решаема, нужно только потратить какоето количество времени.
PM MAIL ICQ   Вверх
math64
Дата 4.3.2009, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



При делении столбиком понадобятся алгоритмы  вычитания, сранения, умножения на однозначное число. Как они у тебя реализованы?
Как удобнее передавать параметры? Возможно их передавать через такой стек:
Код

char stack[1024];
char* sp = stack;
void push(char* number) {
   int i;
   for(i=0; i <4; i++)
     *sp++ = *number++);
}
void pop(char* number) {
  int i;
  number += 4;
  for(i=0; i <4; i++)
    *--number = *--sp;
}
void add() {
  int i;
  for(i=0; i < 4; i++)
    --sp; sp[-4] += *sp;
  correction();
}
void sub() {
  int i;
  for(i=0; i < 4; i++)
    --sp; sp[-4] -= *sp;
  correction();
}
int compare() {
  int i; char c;
  for(i=-4; i < 0; i++) {
    c = sp[i-4] < sp[i];
    if (c < 0) return -1;
    if (c > 0) return 1; 
  }
  return 0;
}
void mult(char n) {
  int i;
  for(i=-1; i >= -4; i--)
    sp[-i] *= n;
  correction();
}
void correction() {
  int i; char c, d;
  c =0;
  for(i=-1; i >= -4; i--) {
    d = sp[i] + c;
    if (d > 0) {
      for (c = 0; d >= 10; c++
        d -= 10;
    } else {
       for(c = 0; d < 0; c--)
         d += 10; c--;
    }
    sp[-i] = d;
  }
}

PM   Вверх
xvr
Дата 4.3.2009, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(MarshallM @ 4.3.2009,  10:24)
ksili, смею огорчить тем, что оперировать с переменными типа int и выше я не могу в силу специфики микропроцессора. Максимально хранимая единица памяти имеет значение 1 байт.

Ну очень специфичный микропроцессор  smile А компилятор С на него есть? А переменные длиннее 1 байта он (компилятор) поддерживает (например long)?  smile 
Цитата

Т.е. даже при всем желании в ячейку памяти я не смогу запихать четырех байтовое число. 
Компилятор должен уметь это делать, и под 4х байтовой число он займет 4 байтовых ячейки памяти
Цитата

А получить в конце мне надо целое число и остаток от деления (опять же в виде массива 1 байтовых "слов").
Сдается мне, что вы заняты изобретением велосипеда.

PM MAIL   Вверх
MarshallM
Дата 5.3.2009, 03:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



xvr, МП и на самом деле весьма специфичный, поэтому вопрос и стоит так коряво, самого аж накаляет... Ну как бы так и не иначе. Пусть переменная типа int и может хранится в четрых ячейках памяти, но оперировать числом как единым целым я опять же не смогу. В дынный момент смогу лишь прочесть все числа из памяти последовательно. Сохранить полученное число типа int мне просто некуда, поэтому и оперирую именно цифрами конкретного четырех байтового числа.
Неее велосипед я не изобретаю)))
Albor, знаю что задача вполне решаема, и уже практически за вчерашний вечер реализовал. Получается конечно вырезание гланд через ...., но вроде результат близок))) Всем спасибо!
PM MAIL   Вверх
xvr
Дата 5.3.2009, 09:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(MarshallM @ 5.3.2009,  03:12)
xvr, МП и на самом деле весьма специфичный, поэтому вопрос и стоит так коряво, самого аж накаляет... Ну как бы так и не иначе. Пусть переменная типа int и может хранится в четрых ячейках памяти, но оперировать числом как единым целым я опять же не смогу. 

Почему? Компилятор может, а вам что мешает?
Цитата

В дынный момент смогу лишь прочесть все числа из памяти последовательно. Сохранить полученное число типа int мне просто некуда, 
В переменную сохранить
Код

char number1[4];
char number2[4];

long my_function()
{
 return *(long*)number1 * *(long*)number2;
}


Цитата

Неее велосипед я не изобретаю)))
Именно его  smile 

PM MAIL   Вверх
MarshallM
Дата 5.3.2009, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



xvr, а если я добью это все дело таким танцем)))
Команда printf подвешивает МП компилируя код на долгий промежуток времени, каким образом она отнесется к операциям с переменными типа long??? Как считаете?
PM MAIL   Вверх
math64
Дата 5.3.2009, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ваш компилятор должен поддерживать работу по крайней мере с 16-разрядными числами. 8-разрядные указатели - это слишком мало. Ho он может считать long 16 разрядным (я не знаю какой у Вас процессор)
printf подвешивает компилятор скорее всего потому, что у него параметры переменной длины.
пользуйтесь itoa() и atoi() для перевода числа в текстовое представление или наоборот.
PM   Вверх
xvr
Дата 5.3.2009, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(MarshallM @ 5.3.2009,  10:37)
xvr, а если я добью это все дело таким танцем)))
Команда printf подвешивает МП компилируя код на долгий промежуток времени,

Команда printf занимается кучей работы по форматированию и выводу. К умножению long'ов сие никакого отношения не имеет
Цитата

каким образом она отнесется к операциям с переменными типа long??? 
А вы их printf'ом перемножать собираетесь?  smile И какая разница, как она к этим переменным будет относится?
Цитата

Как считаете?
Я считаю, что вы не напишите на С умножение long'ов более эффективно, чем это уже сделано на ассемблере в самом компиляторе.

Огласите, пожалуйста, нафига вам это (умножение 32х битных чисел) надо и почему не устраивает то, что есть в компиляторе?

PM MAIL   Вверх
MarshallM
Дата 6.3.2009, 02:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата

Я считаю, что вы не напишите на С умножение long'ов более эффективно, чем это уже сделано на ассемблере в самом компиляторе.

вот с этим я не поспорю)))
PM MAIL   Вверх
chaos
Дата 6.3.2009, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



а может топик стартеру стоит озвучить что за процессор такой?!

Добавлено через 12 минут и 40 секунд
а вообще попахивает каким-то курсовым проектом - извращенец-препод придумал задачку, которую поди сам не решил даже smile

Это сообщение отредактировал(а) chaos - 6.3.2009, 14:40
PM WWW   Вверх
MarshallM
Дата 10.3.2009, 03:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



МП 6502 - самый простой. Все таки при объявлении переменной типа int наступает тишинаааа....)))
Попахивает курсовым))) Что самое интересное, что мне бы наверное так же показалось бы.
PM MAIL   Вверх
chaos
Дата 10.3.2009, 06:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



MarshallM, это тебе поможет
а вот вроде конкретно то что тебе надо division 32bit
PM WWW   Вверх
MarshallM
Дата 10.3.2009, 08:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



chaos,  smile ну блииин, вот я лошара (с) нашараша. Спасибо большое!!!
PM MAIL   Вверх
zim22
Дата 10.3.2009, 08:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



MarshallM, если вы согласны, что деление - это многократное вычитание, то здесь всё очень подробно расписано как реализовать чудеснейший алгоритм вычитания.
http://nekin.narod.ru/math/m0009.htm



--------------------
PM MAIL   Вверх
Страницы: (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.0987 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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