这与以 10 为底的添加没有什么不同。
99
+11
9+1 是 0 携带 1
9+1+进位就是1进位就是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。
与上面的十进制数学没什么不同,只是简单得多,当您将十进制的一列相加时,操作数 a,操作数 b,进位。结果是答案模 10,进位是结果/10。将进位复制到下一列的顶部并永远重复。如 99+11 或 999+111 等所示。
对于更简单的不带进位的两位加法,结果是输入的异或,进位是两个输入的和。您可以使用两个不带进位加法器链接的加法来实现带进位的加法,也可以直接执行。当有奇数个一次或奇偶校验时设置结果,即两个 xor r = a xor b xor 进位。我目前正在努力解决的进位也许有人可以提供帮助。
所以带有进位集的 8 位 0xFF + 0xFF 将给出
1
11111111
+11111111
这显示 0xff + 0xff 在你开始之前有一个“carry the one”进来。
从右边一次看一列,就像十进制数学一样
1+1+1 = 1 携带 1
下一栏
1+1+1 = 1 携带 1
...
这样继续下去,你最终得到
0xFF 带进位设置
所以如果你只有一个 8 位加进位,你可以把两个数字加起来,只要你有记忆。
让我们看一下 16 位加法:
0x1234
+0xABCD
您可以使用 16 位加法 0xBE01 来计算。
或使用 8 位加法器:
清除进位
加进位 0x34+0xCD 结果 0x01 进位集
带进位相加 0x12+0xAB 结果 0xBE 进位清零
所以答案是 0xBE01
如果你只有一个 4 位 alu,则使用 4 位加法器
清除进位
添加进位 0x4+0xD = 0x1 进位位设置
添加进位 0x3+0xC = 0x0 进位位设置
加进位 0x2+0xB = 0xE 进位清零
加进位 0x1+0xA = 0xB 进位位清零
再次将结果 0xBE01 进位位清除
我们也可以使用单个位或 3 位加法器来做到这一点,只要它是二进制的就很简单。
所有有用的处理器都必须有某种方法来添加进位位,以便您可以扩大 alu。有时 add 和 adc 是分开的,有些 adc 是一个额外的步骤,或者最痛苦的是一个不带进位的 add,如果有一个 add 直接在其下,则使用一个分支。
这也是移位或循环通过进位位旋转的原因,因此您可以进行比寄存器/内存位置宽度更宽的位移位。
与十进制相比,二进制乘法简单得令人痛苦,但我会省去你那个,让你考虑一下。
是的,您可以并且应该编写一个程序来尝试一下。仍然可以,我可能是故意引导你走上错误信息的道路。