二进制与加法
全加器:进位输入、进位输出和两台半加器的路径
全加器把三个独立的一位输入 A、B、Cin 相加,输出 S 和 Cout。Cin=1 时本列多一份本列位值,Cin=0 时不增加。S 是总和除以 2 的余数,Cout 是总和除以 2 向下取整,所以 A+B+Cin=2Cout+S。
两台半加器的路径
第一台半加器 H1 加 A 和 B,得到 S1=A XOR B 和 C1=A AND B。第二台半加器 H2 只加 S1 和 Cin,得到 S=S1 XOR Cin 和 C2=S1 AND Cin。最后 OR 把 C1 和 C2 合并成 Cout。
C1 不送进 H2 的一份输入,它已经代表高一位的两份,直接留给 Cout。C1=1 时 A 和 B 都是 1,S1 必为 0,于是 C2 为 0,两种进位不会同时是 1,也不会被算两次。
在多位加法机里,某一列的 Cin 通常来自低一位那一列的 Cout。本页只看单独一列,所以例子中的 Cin 是直接设定的 0 或 1,并不表示有别的机器已经送来了进位。
8 行中间状态
每一行的 A、B、Cin 是三个独立输入,不要拼成一个三位二进制数来读。
| A | B | Cin | S1 | C1 | S | C2 | Cout |
|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
| 0 | 1 | 0 | 1 | 0 | 1 | 0 | 0 |
| 0 | 1 | 1 | 1 | 0 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 0 | 1 | 0 | 0 |
| 1 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 0 | 0 | 1 | 0 | 0 | 1 |
| 1 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
并排走 011 和 110
两例的 Cout 都是 1,但进位来自不同的半加器。
- A=0、B=1、Cin=1:H1 得到 S1=1、C1=0;H2 把 S1=1 和 Cin=1 相加,S=0、C2=1;OR 得到 Cout=1。
- A=1、B=1、Cin=0:H1 得到 S1=0、C1=1;H2 把 S1=0 和 Cin=0 相加,S=0、C2=0;OR 得到 Cout=1。
A = 0, B = 1, Cin = 1
H1 · 第一台半加器
A = 0, B = 1
S1 = 1, C1 = 0
H2 · 第二台半加器
S1 = 1, Cin = 1
S = 0, C2 = 1
OR · OR 门
C1 = 0, C2 = 1
Cout = 1
0 + 1 + 1 = 10₂
A = 1, B = 1, Cin = 0
H1 · 第一台半加器
A = 1, B = 1
S1 = 0, C1 = 1
H2 · 第二台半加器
S1 = 0, Cin = 0
S = 0, C2 = 0
OR · OR 门
C1 = 1, C2 = 0
Cout = 1
1 + 1 + 0 = 10₂
三个输入都是 1
A=1、B=1、Cin=1 时,H1 得到 S1=0、C1=1;H2 把 0 和 1 相加,S=1、C2=0;Cout=1。输出 Cout=1、S=1 写作 11₂,表示 3,这是输出结果,不是输入组合 111。
课程里用加法盒子分两次相加来体验这条路径,不要求学生亲手搭 OR 门。
自我检查
A=0、B=1、Cin=1 时,S1、C1、S、C2、Cout 各是多少?
答案
S1=1、C1=0;S=0、C2=1;Cout=1。检查:0+1+1=2=2×1+0。
A=1、B=1、Cin=0 时,各中间量是多少?
答案
S1=0、C1=1;S=0、C2=0;Cout=1。进位来自 H1,C1 不再送进 H2。
A=1、B=1、Cin=1 时,各中间量是多少?
答案
S1=0、C1=1;S=1、C2=0;Cout=1。总和 3=2×1+1,输出写作 11₂。