|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
09.11.2010, 19:07 | #1 |
Форумчанин
Регистрация: 18.10.2008
Сообщений: 166
|
Деление целых чисел(dw) через вычитание
Напишите пожалуйста сам алгоритм, как с помощью команды вычитания можно поделить число ?
|
10.11.2010, 04:08 | #2 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
Alex1991
Частное от деления можно представить как количество вычитаний делителя из делимого до тех пор, пока делимое сохраняет знак. Это дало возможность организовать деление путем повторения последовательности вычитаний с проверкой знака делимого. Если произошла перемена знака, то нужно уменьшить счетчик числа вычитаний на единицу, а делимое и делитель сложить. Теперь делимое будет равно остатку, а счетчик числа вычитаний равен частному. Так делили на ранних микропроцессорах Intel (i4004, i8080), которые еще не поддерживали команду деления. Пример: делим 125 на 11 125 - 11 = 114 результат >0 частное = 1 114 - 11 = 103 результат >0 частное = 2 103 - 11 = 92 результат >0 частное = 3 92 - 11 = 81 результат >0 частное = 4 81 - 11 = 70 результат >0 частное = 5 70 - 11 = 59 результат >0 частное = 6 59 - 11 = 48 результат >0 частное = 7 48 - 11 = 37 результат >0 частное = 8 37 - 11 = 26 результат >0 частное = 9 26 - 11 = 15 результат >0 частное = 10 15 - 11 = 4 результат >0 частное = 11 4 - 11 = -7 результат <0 частное = 12 -1 = 11 остаток = -7+11 = 4 результат получили за 12 вычитаний проверяем: 125 / 11 = 11,363636363636363636363636363636 остаток: 0,363636363636363636363636363636 * 11 = 3,999999999999999999999999999996 = 4 но это не самый быстрый способ деления, количество вычитаний будет расти с ростом делимого и уменьшением вычитаемого. Вот так можно увеличить скорость деления -- из делимого вычитаем делитель, умноженный на степень двойки. Произведение числа на 2ⁿ эквивалентно сдвигу этого числа на n разрядов влево. Если знак результата положительный, то нужно прибавить 2ⁿ к частному, если знак результата отрицательный – частное не увеличивается. Когда знак результата меняется на отрицательный, вычитание заменяется сложением. Так повторяется при уменьшающихся степенях двойки до тех пор, пока не будет достигнута степень, равная нулю. Остатком считается последний положительный результат. Опять разделим 125 на 11. Делитель укладывается в байт (11<255), поэтому начинаем с 2^7. В начале вычисления частное всегда равно 0: 125 – 11 * 2^7 = –1283 –1283 +11 * 2^6 = –579 –579 +11 * 2^5 = –227 –227 +11 * 2^4 = –51 –51 + 11 * 2³ = 37 результат положительный, поэтому складываем 2³ с частным, частное равно 8+0=8 37 – 11 * 2² = – 7 –7 + 11 * 2¹ = 15 результат положительный, поэтому складываем 2¹ с частным, частное равно 2+8=10 15 –11 * 2º = 4 результат положительный, поэтому складываем 2º с частным, частное равно 1+10=11, остаток равен 4 результат получили за 8 вычитаний А теперь самостоятельно попробуйте разделить 1023 на 5 первым и вторым способом Последний раз редактировалось Mikl___; 10.11.2010 в 10:32. |
10.11.2010, 06:05 | #3 |
Пользователь
Регистрация: 12.10.2010
Сообщений: 79
|
Имею хитрый план по личному обогащению
|
10.11.2010, 17:15 | #4 |
Форумчанин
Регистрация: 18.10.2008
Сообщений: 166
|
Mikl___, Благодарю принцип понятен !
|
11.11.2010, 04:02 | #5 |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
Alex1991
А дополнительное задание сделал?(разделить 1023 на 5) Сколько вычитаний получилось при использовании первого способа и сколько -- вторым способом? Да, в #2 опечатка -- вместо "Делитель укладывается в байт (11 < 255)" следует читать "Делимое укладывается в байт (125 < 256)" поэтому при делении 1023 на 5 (255 < 1023 < 65536) следует начать с 2^15. Количество вычитаний можно еще больше уменьшить если найти ближайшую степень 2 умноженную на 5, которая будет больше или равна 1023, то есть 5*2^8 = 1280 > 1023 и вычисления начинать с 2^8 Итого: в первом варианте 205 вычитаний, а во втором варианте всего 9 вычитаний Последний раз редактировалось Mikl___; 11.11.2010 в 06:08. |
11.11.2010, 16:28 | #6 | |
Форумчанин
Регистрация: 18.10.2008
Сообщений: 166
|
Цитата:
|
|
12.11.2010, 07:11 | #7 | |
Участник клуба
Регистрация: 11.01.2010
Сообщений: 1,139
|
Цитата:
|
|
12.11.2010, 14:50 | #8 |
Форумчанин
Регистрация: 18.10.2008
Сообщений: 166
|
|
Опции темы | Поиск в этой теме |
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
ВЫчитание, умножение и деление массивов на С++ | Flood | Помощь студентам | 2 | 15.05.2010 16:54 |
[Asm] Деление чисел | aggro11 | Помощь студентам | 0 | 05.05.2010 23:36 |
Ассемблер Лаба Сложение и вычитание чисел | zefir1594 | Фриланс | 6 | 11.03.2010 19:22 |
Сложение, вычитание, деление, умножение в Turbo Debugger | GaJIbI4 | Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM | 9 | 08.03.2010 15:23 |
Вычитание чисел по основанию 4 и 16. | Stager | Общие вопросы C/C++ | 1 | 21.01.2009 00:13 |