Реализация вычитания сумматором — различия между версиями
Alex z (обсуждение | вклад) |
м (rollbackEdits.php mass rollback) |
||
| (не показано 11 промежуточных версий 4 участников) | |||
| Строка 1: | Строка 1: | ||
==Преобразование чисел для вычитания сумматором== | ==Преобразование чисел для вычитания сумматором== | ||
| − | + | Чтобы реализовать вычитание [[Каскадный сумматор|каскадным]] или [[Двоичный каскадный сумматор|двоичным каскадным сумматором]], нужно сложить на нём уменьшаемое с противоположным по знаку вычитаемым, так же как и при вычитании обычных чисел. Тогда полученная сумма будет разностью данных чисел: <tex> x - y = x + (-y)</tex>. | |
| − | + | Инверсия знака записанного в двоичном виде числа происходит точно так же, как и в [[Представление целых чисел: прямой код, код со сдвигом, дополнительный код#Дополнительный код|дополнительном коде]]. | |
| + | Данное число нужно инвертировать и прибавить к нему единицу: <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 </tex> | |
| − | |||
| − | |||
| − | < | ||
| − | |||
| − | |||
| − | |||
==Оптимизация== | ==Оптимизация== | ||
| − | Очевидно, что | + | Очевидно, что реализация преобразования в дополнительный код отдельным сумматором делает вычисление разности в два раза медленнее, чем вычисление суммы. Чтобы ускорить вычисления нужно воспользоваться первым битом переноса в сумматоре: для реализации суммы в него посылают ноль, а для реализации вычитания посылать в него единицу при вычитании и ноль при суммировании. Вместо того, чтобы инвертировать вычитаемое число, можно делать XOR бита первого переноса с каждым битом вычитаемого числа. Таким образом, полученная схема будет работать как для суммирования, так и для вычитания, и при этом вычитание не требует больше времени, чем сложение. |
| − | == | + | ==Схема реализации вычитания сумматором== |
{| | {| | ||
|- | |- | ||
!Условные обозначения | !Условные обозначения | ||
| − | !Изображение | + | !Изображение схемы |
|- | |- | ||
| | | | ||
{| border="1" | {| border="1" | ||
![[Файл:XOR_logic_element.png|100px|XOR]] | ![[Файл:XOR_logic_element.png|100px|XOR]] | ||
| − | | логический [[Реализация булевой функции схемой из функциональных элементов|функциональный элемент]]'''XOR''' | + | | логический [[Реализация булевой функции схемой из функциональных элементов|функциональный элемент]] '''XOR''' |
| − | !< | + | |
| + | '''A''' и '''B''' входы и '''Y''' выход. | ||
| + | !<tex> \large A \oplus B = Y</tex> | ||
| + | |||
| + | <tex> \large 0 \oplus 0 = 0</tex> | ||
| + | |||
| + | <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, \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|Арифмометр]] | |[[Файл: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://tams-www.informatik.uni-hamburg.de/applets/hades/webdemos/20-arithmetic/40-addsub/add-sub.html Рабочий пример арифмометра] | ||
| + | |||
| + | [[Категория:Дискретная математика и алгоритмы]] | ||
| + | [[Категория:Схемы из функциональных элементов]] | ||
Текущая версия на 19:07, 4 сентября 2022
Содержание
Преобразование чисел для вычитания сумматором
Чтобы реализовать вычитание каскадным или двоичным каскадным сумматором, нужно сложить на нём уменьшаемое с противоположным по знаку вычитаемым, так же как и при вычитании обычных чисел. Тогда полученная сумма будет разностью данных чисел: .
Инверсия знака записанного в двоичном виде числа происходит точно так же, как и в дополнительном коде.
Данное число нужно инвертировать и прибавить к нему единицу: .
Например, число будет записано как , так как , а
Оптимизация
Очевидно, что реализация преобразования в дополнительный код отдельным сумматором делает вычисление разности в два раза медленнее, чем вычисление суммы. Чтобы ускорить вычисления нужно воспользоваться первым битом переноса в сумматоре: для реализации суммы в него посылают ноль, а для реализации вычитания посылать в него единицу при вычитании и ноль при суммировании. Вместо того, чтобы инвертировать вычитаемое число, можно делать XOR бита первого переноса с каждым битом вычитаемого числа. Таким образом, полученная схема будет работать как для суммирования, так и для вычитания, и при этом вычитание не требует больше времени, чем сложение.
Схема реализации вычитания сумматором
| Условные обозначения | Изображение схемы | ||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|