![]() ![]() |
|
1 | |
Реализация целочисленного беззнакового деления03.12.2009, 12:38. Показов 4897. Ответов 9
Метки нет Все метки)
(
Может у кого есть готовая реализация. По сути дела делается деление столбиков через операции сдвигов и вычитаний. Математика на пальцах понятна, но реализовывать подобные вещи не люблю, а потому для начала решил спросить, вдруг у кого-то уже есть
0
|
|
03.12.2009, 12:38 | |
Ответы с готовыми решениями:
9
Выполнить операции беззнакового умножения и целочисленного беззнакового деления
Остаток целочисленного деления X на Y Проверка целочисленного деления. |
![]() ![]() |
|
03.12.2009, 23:53 [ТС] | 2 |
Для истории обратная ссылка https://www.cyberforum.ru/asse... 68754.html
0
|
64 / 63 / 3
Регистрация: 16.11.2009
Сообщений: 156
|
||||||
04.12.2009, 07:19 | 3 | |||||
Dividend - делимое.
Divisor - делитель. Quotient - частное. Remainder - остаток.
1
|
64 / 63 / 3
Регистрация: 16.11.2009
Сообщений: 156
|
|
04.12.2009, 15:14 | 5 |
Remainder:Quotient это одно большое число. Старшая часть числа это остаток, а младшая делимое/частное.
Сначала там будет 0:1011b, потом биты по одному двигаются в остаток -> 1:0110b. Допустим делитель 10b. 1 меньше 10b. Двигаем следующий бит. 10b:1100b. 10 = 10, вычитаем и устанавливаем младший бит в результате -> 0:1101. Двигаем следующий бит. -> 1:1010. Остаток снова меньше делителя. Двигаем еще один бит. 11:0100. Остаток больше делителя. Вычитаем и устанавливаем младший бит частного -> 1:0101. Так как у нас было 4 бита в оригинальном числе, на этом цикл заканчивается. Частное 101b = 5d, остаток 1. 1011b = 11d делить на 10b = 2d результат 5 и 1 в остатке.
0
|
![]() ![]() |
||||||
04.12.2009, 17:00 [ТС] | 6 | |||||
Я правильно понимаю, что, например, для 32-битного деления запись "Remainder:Quotient" означает 64-битную величину, в старших 32 битах которого записано Reminder, а в младших 32 битах - Quotient?
Добавлено через 3 минуты Потому что по началу запись "Remainder:Quotient := Remainder:Quotient SHL 1" я воспринял ак некую компактную форму записи "Remainder := Remainder SHL 1; Quotient := Quotient SHL 1" Добавлено через 3 минуты Нашёл какой-то исходник, который делает что-то похожее, только не понял, зачем делается в два цикла
0
|
64 / 63 / 3
Регистрация: 16.11.2009
Сообщений: 156
|
|
04.12.2009, 18:35 | 7 |
0
|
64 / 63 / 3
Регистрация: 16.11.2009
Сообщений: 156
|
|
05.12.2009, 08:18 | 9 |
хм... Теперь я понял алгоритм этого си кода. Но не понял, почему два цикла. Есть только предположения...
Может пытаются оптимизировать. Первый цикл быстро крутит до первоого remainder>=dividend без лишних движений. Но второй цикл точно не оптимальный. Кажется, автор не знал, что для делимого и частного можно использовать одно число.
0
|
![]() ![]() |
|
05.12.2009, 13:08 [ТС] | 10 |
Я тоже не понял, но похоже, что код писался по какую-то конкретную архитектуру и конкретный компилятор, который при таком построении кода лучше организует аппаратную накрутку цикла - во втором цикле условные код есть только в конце и под условием стоит только пересылка, видимо оно лучше в конвейер укладывается
0
|
05.12.2009, 13:08 | |
Помогаю со студенческими работами здесь
10
Остаток от целочисленного деления Остаток от целочисленного деления
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |