二进制与加法

全加器:进位输入、进位输出和两台半加器的路径

全加器把三个独立的一位输入 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 是三个独立输入,不要拼成一个三位二进制数来读。

全加器中间状态:S1、C1 来自第一台半加器,S、C2 来自第二台,Cout 为 C1 OR C2
ABCinS1C1SC2Cout
00000000
00100100
01010100
01110011
10010100
10110011
11001001
11101101

并排走 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

  1. H1 · 第一台半加器

    A = 0, B = 1

    S1 = 1, C1 = 0

  2. H2 · 第二台半加器

    S1 = 1, Cin = 1

    S = 0, C2 = 1

  3. OR · OR 门

    C1 = 0, C2 = 1

    Cout = 1

0 + 1 + 1 = 10₂

A = 1, B = 1, Cin = 0

  1. H1 · 第一台半加器

    A = 1, B = 1

    S1 = 0, C1 = 1

  2. H2 · 第二台半加器

    S1 = 0, Cin = 0

    S = 0, C2 = 0

  3. OR · OR 门

    C1 = 1, C2 = 0

    Cout = 1

1 + 1 + 0 = 10₂

第一例 A=0、B=1、Cin=1:H1 输出 S1=1、C1=0,H2 输出 S=0、C2=1,OR 输出 Cout=1。第二例 A=1、B=1、Cin=0:H1 输出 S1=0、C1=1,H2 输出 S=0、C2=0,OR 输出 Cout=1。

三个输入都是 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 门。

自我检查

  1. 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。

  2. A=1、B=1、Cin=0 时,各中间量是多少?

    答案

    S1=0、C1=1;S=0、C2=0;Cout=1。进位来自 H1,C1 不再送进 H2。

  3. A=1、B=1、Cin=1 时,各中间量是多少?

    答案

    S1=0、C1=1;S=1、C2=0;Cout=1。总和 3=2×1+1,输出写作 11₂。