Деление двоичных чисел в эвм
[COLOR="silver"] Во всей сети нашел лишь одну статью пытающуюся каким-то образом расписать решение, но вот результаты их делений не совпадают с действительностью.[/COLOR]
Если не жалко, просьба поделитесь знаниями.
к примеру хотелось бы рассмотреть процесс деления 96 на 3.
Обратный код — метод вычислительной математики, позволяющий вычесть одно число из другого, используя только операцию сложения над натуральными числами.
Рассмотреть процесс деления - хотелось бы увидеть процесс деления именно по действиям, а не сразу результат.
Рассказывать о деление в столбик - Вы, дорогой, имеете представление об операциях при деление в машинах? о разложение деления на несколько операций сложения в этом самом обратно модифицированном коде? если нет - то это не то обычное деление в столбик кое Вы, видимо, подразумеваете, а то в коем есть операции сдвига и занесения в "регистр" значения, в зависимости от остатка при сложении.
* 101
------------
1001 (1001*1)
+ 0 (1001*0)
+ 1001 (1001*1)
------------
101101
Приблизительный алгоритм "компьютерной" реализации (101 - множитель1, 1001 - множитель2):
1.очистить результат
2.цикл по битам множитель1
3.побитовый сдвиг результата в лево на 1 (или множителя1 вправо)
4.если множитель1.битN=1
прибавить к результат множитель2
5.продолжить цикл
с делением тоже только наоборот.
А обратный, дополнительный и пр. код, описание которых вы взяли с википедии лишь позволяют за счёт особенностей хранения чисел в памяти оптимизировать эти алгоритмы.
Ну а вот статейка которая вам доступно всё объяснит.
Рассказывать о деление в столбик - Вы, дорогой, имеете представление об операциях при деление в машинах? о разложение деления на несколько операций сложения в этом самом обратно модифицированном коде? если нет - то это не то обычное деление в столбик кое Вы, видимо, подразумеваете, а то в коем есть операции сдвига и занесения в "регистр" значения, в зависимости от остатка при сложении.
Какое-то имею :-)
По сути это и есть деление в столбик, но с оптимизацией под конкретные доступные процессорные команды.
А(делимое) =96(10) =1100000(2) = 001100000(2д.м.)
Б(делитель) =3(10) =11(2) =0011(2д.м.)
-Б(2д.о.м.) =1101
в получившемся делимом имеет n-знаков, в регистре(т.е. том месте где собсна будет записан ответ), должно быть n-2. На чем всё это основывается - хз.
далее само решение:
000000000 | 0000000
-------------------------------
[COLOR="royalblue"]0[/COLOR]01100000 | 0000000
+([COLOR="royalblue"]-Б[/COLOR]):
110100000
-------------------------------
[COLOR="red"]0[/COLOR]00000000 | 000000[COLOR="red"]1[/COLOR]
<-сдвиг:
[COLOR="royalblue"]0[/COLOR]00000000
+([COLOR="royalblue"]-Б[/COLOR]):
110100000
-------------------------------
[COLOR="red"]1[/COLOR]10100000 |0000001[COLOR="red"]0[/COLOR]
<-сдвиг:
[COLOR="royalblue"]1[/COLOR]01000000
[COLOR="royalblue"]+Б[/COLOR]:
001100000
-------------------------------
[COLOR="red"]1[/COLOR]10100000 | 000010[COLOR="red"]0[/COLOR]
<-сдвиг:
[COLOR="royalblue"]1[/COLOR]01000000
[COLOR="royalblue"]+Б[/COLOR]:
001100000
-------------------------------
.
. и т.д. как видете алгоритм будет повторяться пока "реестр" не переполнится.
.
-------------------------------
[COLOR="red"]1[/COLOR]10100000 | 100000[COLOR="red"]0[/COLOR]
<-сдвиг:
[COLOR="royalblue"]1[/COLOR]01000000
[COLOR="royalblue"]+Б[/COLOR]:
001100000
-------------------------------
По сути на этом и заканчивается "деление" пока не переполнится регистр либо пока делить уже будет нечего.
Но вот в чем проблема 1000000(2) это 64(10), а ответ д/б 32(10), как Вы понимаете. Отсюда следует что где-то не правильно либо понят, либо объяснён материал.
Отсюда вопрос - сколько раз нужно производить подобную операцию - до окончательного получения результата?
ПС: я не спроста написал именно поделиться знаниями. расшарить пару ссылок любой может.
ну вы только что сами и ответили на свой вопрос о происхождение определения.
пожалуйста, можете посмотреть его объяснение http://www.youtube.com/watch?feature=player_embedded&v=19wzwy1PoJI
Погуглил - знаковых разряда два и наличие знака это "11" в знаковой паре разрядов. Да, было такое :) За отсутствием практики из башки все повылетало (ну один раз запрогал CPU-подобный калькулятор на VHDL ^_^, за все время учебы то).
Если найду лекции и там есть что-то подробное, выложу :)
--added
Посмотрел видео с преподом. Блин, убивает просто, почему в 21 веке мы до сих пор ковыряемся с доской и мелом, каждый раз на лекциях заново выписывая примеры, правя ошибки по невнимательности. Сколько еще будем расти до заранее готовых, наглядных и эффективных презентаций с нормальным сопровождением. =\
p. s. у нас на кафедре был проектор, но в учебном процессе по первому высшему не использовался xDD
Посмотрел видео с преподом. Блин, убивает просто, почему в 21 веке мы до сих пор ковыряемся с доской и мелом, каждый раз на лекциях заново выписывая примеры, правя ошибки по невнимательности. Сколько еще будем расти до заранее готовых, наглядных и эффективных презентаций с нормальным сопровождением. =\
Это бездонно обсуждаемая тема)
Буду признателен за лекции =)
А также буду признателен тому кто всё таки выложит пример именно деления а не "умножения только всё наоборот" =\