Изменения

Перейти к: навигация, поиск

Реализация вычитания сумматором

2619 байт добавлено, 19:07, 4 сентября 2022
м
rollbackEdits.php mass rollback
==Преобразование чисел для вычитания сумматором==
Что бы Чтобы реализовать вычитание [[Каскадный сумматор|каскадным]] или [[Двоичный каскадный сумматор|двоичным каскадным сумматором]], нужно сложить на нём уменьшаемое с противоположным по знаку вычитаемым, так же как и при вычитании обычных чисел. Тогда полученная сумма будет разностью данных чисел: <tex> x - y = x + (-y)</tex>.
<math> \mathbf x - y = x +(-y)</math>Инверсия знака записанного в двоичном виде числа происходит точно так же, как и в [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код#Дополнительный код|дополнительном коде]].
Данное число нужно инвертировать и прибавить к нему единицу: <tex> -y = (\lnot y) + 1 </tex>.
Инверсия знака записанного в двоичном виде числа происходит точно так жеНапример, число <tex> \large - 19</tex> будет записано как и в [[Представление целых чисел: прямой код<tex> \large 01101 </tex>, код со сдвигомтак как <tex> \large 19_\mathrm{10} = 10011_\mathrm{2}</tex>, дополнительный код#Дополнительный код|дополнительном коде]]. а <tex> \large (\lnot 10011) + 1 = 01100 + 1 = 01101 <br/tex>Данное число нужно инвертировать и прибавить к нему единицу.
==Оптимизация==Очевидно, что реализация преобразования в дополнительный код отдельным сумматором делает вычисление разности в два раза медленнее, чем вычисление суммы. Чтобы ускорить вычисления нужно воспользоваться первым битом переноса в сумматоре: для реализации суммы в него посылают ноль, а для реализации вычитания посылать в него единицу при вычитании и ноль при суммировании. Вместо того, чтобы инвертировать вычитаемое число, можно делать XOR бита первого переноса с каждым битом вычитаемого числа. Таким образом, полученная схема будет работать как для суммирования, так и для вычитания, и при этом вычитание не требует больше времени, чем сложение. ==Схема реализации вычитания сумматором=={||-!Условные обозначения!Изображение схемы|-|{| border="1"![[Файл:XOR_logic_element.png|100px|XOR]]| логический [[Реализация булевой функции схемой из функциональных элементов|функциональный элемент]] '''XOR''' '''A''' и '''B''' входы и '''Y''' выход.!<mathtex> \mathbf -y large A \oplus B = (\lnot y) + 1 Y</mathtex>
Например число <mathtex> \mathbf - 19</math> будет записано как <math> large 0 \mathbf 01101 </math>, так как <math> \mathbf 19_\mathrm{10} = 10011_\mathrm{2}</math>, а <math> (\lnot 10011) + 1 = 01100 + 1 oplus 0 = 01101 0</mathtex>
<tex> \large 0 \oplus 1 = 1</tex>
<tex> \large 1 \oplus 0 =1</tex> <tex> \large 1 \oplus 1 =Оптимизация==0</tex>|-Очевидно!<tex> \mathbf {\mbox{A}_\mathrm{0} , \mbox{A}_\mathrm{1}, \dots, что такой подход к вычитанию сумматором не оптимален.Что бы упростить вычисления нужно воспользоваться лишним битом переноса в сумматоре\mbox{A}_\mathrm{N}} </tex>|биты первого слагаемого (уменьшаемого)!<tex> \large A </tex>|-!<tex> \mathbf {\mbox{B}_\mathrm{0} , в который посылают ноль\mbox{B}_\mathrm{1}, и послать в него единицу при вычитании и ноль при суммировании. Вместо того что бы инвертировать вычитаемое число\dots, можно сделать XOR бита первого переноса с каждым битом \mbox{B}_\mathrm{N}} </tex>|биты второго слагаемого (вычитаемого числа)!<tex> \large B</tex>|-!<tex> \mathbf {\mbox{S}_\mathrm{0} , \mbox{S}_\mathrm{1}, \dots, \mbox{S}_\mathrm{N}} </tex>|биты ответа.!<tex> \large S = A \pm B</tex>|-!<tex> \mathbf {T} </tex>|бит, отвечающий за знак операции'''T''' подключён к '''C<small>0</small>'''|<center>'''0''' если <tex> \large S = A + B</tex><br />Таким образом, можно посылать в полученный ''арифмометр для сложения и вычитания'1''' числа точно так же как и при сложенииесли <tex> \large S = A - B</tex></center>|-!<tex> \mathbf {0 , только первый бит переноса будет отвечать за знак операции1, \dots, N} </tex>|полные сумматоры |[[Файл:Full_Adder.png|250px|Блок сумматор]]|}|[[Файл:Arithmometer_SUM_SUB.png|400px|Арифмометр]]|} ==См. также==*[[Двоичный_каскадный_сумматор|Сумматор]]*[[Матричный_умножитель|Матричный умножитель]]*[[Реализация_булевой_функции_схемой_из_функциональных_элементов|Реализация булевой функции схемой из функциональных элементов]] ==Источники информации==*[http://en.wikipedia.org/wiki/Subtractor Subtractor]*[http://www.play-hookey.com/digital/binary_subtraction.html Negative Numbers and Binary Subtraction]*[http: 0//tams-www.informatik.uni-hamburg.de/applets/hades/webdemos/20-arithmetic/40-сложение 1addsub/add-вычитаниеsub.html Рабочий пример арифмометра]
<!-- Узнаю как загружать изображения, добавлю наглядную схему. -->[[Категория:Дискретная математика и алгоритмы]][[Категория:Схемы из функциональных элементов]]
1632
правки

Навигация