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

Материал из Викиконспекты
Версия от 06:07, 29 ноября 2011; 192.168.0.2 (обсуждение) (Новая страница: «==Преобразование чисел для вычитания сумматором== Что бы реализовать вычитание [[Каскадный...»)
(разн.) ← Предыдущая | Текущая версия (разн.) | Следующая → (разн.)
Перейти к: навигация, поиск

Преобразование чисел для вычитания сумматором

Что бы реализовать вычитание каскадным или двоичным каскадным сумматором, нужно сложить на нём уменьшаемое с противоположным по знаку вычитаемым, так же как и при вычитании обычных чисел. Тогда полученная сумма будет разностью данных чисел.

[math] \mathbf x - y = x +(-y)[/math]


Инверсия знака записанного в двоичном виде числа происходит точно так же, как и в дополнительном коде.
Данное число нужно инвертировать и прибавить к нему единицу.

[math] \mathbf -y = (\lnot y) + 1 [/math]

Например число [math] \mathbf - 19[/math] будет записано как [math] \mathbf 01101 [/math], так как [math] \mathbf 19_\mathrm{10} = 10011_\mathrm{2}[/math], а [math] (\lnot 10011) + 1 = 01100 + 1 = 01101 [/math]


Оптимизация

Очевидно, что такой подход к вычитанию сумматором не оптимален.Что бы упростить вычисления нужно воспользоваться лишним битом переноса в сумматоре, в который посылают ноль, и послать в него единицу при вычитании и ноль при суммировании. Вместо того что бы инвертировать вычитаемое число, можно сделать XOR бита первого переноса с каждым битом вычитаемого числа.
Таким образом, можно посылать в полученный арифмометр для сложения и вычитания числа точно так же как и при сложении, только первый бит переноса будет отвечать за знак операции: 0-сложение 1-вычитание.