Ничем не отличается от добавления в базу 10.
99
+11
9+1 is zero carry the 1
9+1+carry is 1 carry the 1
Результат приведенной выше десятичной математики - 10 с переносом 1 или 110, если вы хотите думать об этом таким образом.
Для двоичного запуска с однобитным сумматором, вот таблица истинности:
000 0 0
001 0 1
010 0 1
011 1 0
100 0 1
101 1 0
110 1 0
111 1 1
левый столбец из трех битов - это входные комбинации, два операнда и перенос,
второй столбец выполняется, а третий столбец является результатом
, поэтому 1 + 1 без переноса - 110 в левом столбце, а результат 0 - перенос 1. 1. 1011 *
Не отличается от десятичной математики, описанной выше, просто намного проще, когда вы складываете столбец в десятичном виде, операнд a, операнд b, перенос. Результатом является ответ по модулю 10, а переносом является результат / 10. скопируйте перенос в начало следующего столбца и повторите его навсегда. как показано с 99 + 11 или 999 + 111 и т. д.
Для более простого двухбитного сложения без переноса результатом является xor входов, а выполнением - оба входа. Вы можете реализовать сложение с переносом, используя два сложения без сумматоров переноса, или сделать это напрямую. Результат устанавливается, когда есть нечетное число единиц или нечетная четность, то есть два xors r = a xor b xor переноса. Выполнение, с которым я сейчас борюсь, возможно, кто-то может помочь.
так что 8 бит 0xFF + 0xFF с набором переноса даст
1
11111111
+11111111
Показывает 0xff + 0xff с надписью «нести один» перед началом.
посмотрите на него по одному столбцу за раз справа, как десятичная математика
1+1+1 = 1 carry the 1
next column
1+1+1 = 1 carry the 1
...
это продолжается, и вы в конечном итоге
0xFF с установленным битом переноса
Таким образом, если у вас есть только 8-битное сложение с переносом, вы можете сложить два числа шириной, насколько у вас есть память.
Давайте посмотрим на 16-битное добавление:
0x1234
+0xABCD
Вы можете просто сделать математику с 16-битным сложением, 0xBE01.
или с 8-битным сумматором:
clear the carry bit
add with carry 0x34+0xCD result 0x01 carry set
add with carry 0x12+0xAB result 0xBE carry clear
поэтому ответ 0xBE01
Или используя 4-битный сумматор, если все, что у вас есть, это 4-битное alu
clear the carry bit
add with carry 0x4+0xD = 0x1 carry bit set
add with carry 0x3+0xC = 0x0 carry bit set
add with carry 0x2+0xB = 0xE carry bit clear
add with carry 0x1+0xA = 0xB carry bit clear
снова результат 0xBE01, чистый бит переноса
мы могли бы сделать это и с одиночными битами или с 3-битным сумматором, если он двоичный, то он тривиален.
У всех полезных процессоров должен быть способ добавить бит переноса, чтобы вы могли расширить alu. Иногда существуют отдельные add и adc, некоторые adc - это дополнительный шаг, или наиболее болезненным будет добавление без переноса и использование ветки, если перенос выполняется с добавлением непосредственно под ним.
Именно поэтому сдвиги или повороты вращаются через бит переноса, поэтому вы можете сделать сдвиг бита шире, чем ширина регистра / ячейки памяти.
двоичное умножение до боли простое по сравнению с десятичным, но я избавлю тебя от этого и позволю тебе подумать об этом.
Да, вы могли бы и должны были написать программу, чтобы попробовать это. И все же могу, я мог бы преднамеренно вести вас по пути дезинформации.