一、余3码的定义
余3码是一种 BCD(二-十进制编码)的变种,它的编码规则是:
余3码=对应十进制数+3(用4位二进制表示)余3码=对应十进制数+3(用4位二进制表示)
| 十进制 | BCD(8421) | 余3码 |
|---|---|---|
| 0 | 0000 | 0011 |
| 1 | 0001 | 0100 |
| 2 | 0010 | 0101 |
| 3 | 0011 | 0110 |
| 4 | 0100 | 0111 |
| 5 | 0101 | 1000 |
| 6 | 0110 | 1001 |
| 7 | 0111 | 1010 |
| 8 | 1000 | 1011 |
| 9 | 1001 | 1100 |
二、核心问题:为什么"两数之和为10时正好等于二进制16"?
1. 数学推导
设两个十进制数 A、B,它们的余3码分别为:
Axs3=A+3Axs3=A+3 Bxs3=B+3Bxs3=B+3
将两个余3码直接做4位二进制加法:
Axs3+Bxs3=(A+3)+(B+3)=(A+B)+6Axs3+Bxs3=(A+3)+(B+3)=(A+B)+6
2. 关键临界点:A + B = 10
当两个十进制数相加正好等于 10(即产生十进制进位的临界点)时:
Axs3+Bxs3=10+6=16=(10000)2Axs3+Bxs3=10+6=16=(10000)2
而 4 位二进制能表示的最大值是 15(即 1111),16 = 10000,正好从第 4 位(最高位)自动溢出一个进位 1!
三、为什么这是一个"巧妙"的特性?
1. 对比 8421 BCD 码的缺陷
如果用普通 8421 BCD 码做加法:
例:5 + 5 = 10
- 0101 + 0101 =1010(二进制是 10,但 BCD 中 1010 是非法码!)
- 不会自动产生进位,必须通过额外电路检测"结果 > 9",再+6 修正
例:8 + 5 = 13
- 1000 + 0101 =1101(13,但 BCD 非法码)
- 同样需要 +6 修正才能得到 0001 0011
8421 BCD 的问题:4 位二进制满量程 16,而 BCD 只用到 10,多出 6 个无效编码,所以需要"加 6 修正"。
2. 余3码的优势:进位自动产生
由于每个数都"预加了 3",两数相加就预加了 6,正好补足了二进制满 16 与十进制满 10 之间的差额!
| A + B 值 | 余3码相加结果 | 是否产生进位 | 含义 |
|---|---|---|---|
| < 10 | < 16 | 无进位 | 十进制无进位 |
| = 10 | = 16 | 有进位(自动) | 十进制刚好进位 |
| > 10 | > 16 | 有进位(自动) | 十进制有进位 |
结论:余3码加法时,二进制最高位的进位信号 = 十进制进位信号,无需额外判断电路!
四、举例说明
例 1:4 + 3 = 7(无进位)
| 二进制 | |
|---|---|
| 4 的余3码 | 0111 |
| 3 的余3码 | 0110 |
| 相加 | 1101 = 13 |
- 无进位输出(最高位无溢出)
- 结果 1101 = 13,需要 −3 修正→ 1101 − 0011 =1010?
不对,应该减 3:1101 − 0011 = 1010,但 1010 不是余3码 7(余3码 7 = 1010)✓ 正确!
规则:无进位时,结果−3(减 0011)才是正确余3码结果。
例 2:5 + 5 = 10(恰好进位)
| 二进制 | |
|---|---|
| 5 的余3码 | 1000 |
| 5 的余3码 | 1000 |
| 相加 | 1 0000 |
- 最高位自动产生进位 1✓(十进制确实进位)
- 低 4 位 = 0000,需要+3 修正→ 0000 + 0011 =0011= 余3码 0
- 结果:进位 1,本位 0 →10✓
规则:有进位时,结果+3(加 0011)才是正确余3码结果。
例 3:8 + 5 = 13(有进位)
| 二进制 | |
|---|---|
| 8 的余3码 | 1011 |
| 5 的余3码 | 1000 |
| 相加 | 1 0011 |
- 最高位自动产生进位 1✓
- 低 4 位 = 0011,+3 修正 → 0110 = 余3码 3
- 结果:进位 1,本位 3 →13✓
五、修正规则总结
| 情况 | 进位 Cout | 修正方法 |
|---|---|---|
| A+B < 10 | 0 | 低 4 位 −3(即 +1101 补码加 3) |
| A+B ≥ 10 | 1(自动产生) | 低 4 位 +3 |
六、余3码的其他优点
- 进位自动产生(本题核心):硬件电路简单,不需要额外的"大于 9"比较器
- 自补码特性(最重要的优点之一):
- 9 的余3码 = 1100,0 的余3码 = 0011,互为反码
- 求 9 的补码只需按位取反,便于实现减法运算(变加为减)
- 无全零码:0 的编码是 0011,没有"全 0"编码,便于故障检测(区分"无信号"与"零值")
七、本质原理总结(回答核心问题)
为什么 A+B = 10 时正好产生进位?
| 角度 | 解释 |
|---|---|
| 数学本质 | A+3 与 B+3 相加 = A+B+6,而二进制 4 位满量程 16 = 10 + 6,预加的 6 正好填补两者差额 |
| 进位含义 | 当 A+B ≥ 10(十进制进位)时,A+B+6 ≥ 16(二进制进位),两种进位条件等价 |
| 硬件意义 | 直接用普通 4 位二进制加法器的 Cout 作为十进制进位信号,省去判别电路 |
| 设计哲学 | 把"修正"提前嵌入到编码中(每个数 +3),让加法器自然产生正确的进位 |
八、与 BCD 码进位电路的对比
8421 BCD 加法器需要:
Run
进位 = Cout(原始) OR (S3·S2) OR (S3·S1)(即结果 ≥ 10 时强制产生进位,还要 +6 修正)
余3码加法器只需要:
Apply
进位 = Cout(原始) ← 直接用! 低4位修正 = +3 或 −3 ← 由进位信号决定电路简化:减少了一个"大于 9 检测"电路,这就是余3码在早期计算机(如 IBM 1401、IBM 1620)中被广泛应用的原因。
总结
余3码的核心思想是:通过给每个数预加 3,把"BCD 十进制满 10 进位"和"二进制 4 位满 16 进位"两个不同的进位条件统一起来,让最高位的二进制进位信号天然等于十进制进位信号——这就是它"便于计算、自动产生进位"的根本原因。