5.1.2_BCD码

简介: 计算机组成原理之BCD码

一、引子

这一个小节我们要学习的是BCD码,BCD码的意思是使用二进制来编码的十进制数。
我们要学习三种BCD码,分别是 8421 码、余3码和 2421 码。
image.png
8421 码是我们需要重点掌握的,我们需要学会 8421 码的加法运算怎么执行。

二、BCD码

(1)作用

首先来解释一下BCD码的作用。
在上个小节中,我们学习了二进制数和十进制数。
其中二进制数是比较方便让计算机来处理的,但是十进制数又比较符合我们人类的阅读习惯。如果我们想要把二进制转换成十进制,可以用每一个数码位乘以数码位上的权值,进行一个相乘相加的操作,就可以转换成与之对应的十进制的值。
image.png
使用这种方式把机器数转换成我们熟悉的十进制数是比较麻烦的,而BCD码就是为了解决这个问题,用BCD码来表示数字的原理是这样的,我们可以用 4 个二进制位,也就是 4 个比特的信息来对应上一个十进制位
因为 4 个二进制位可以表示的状态是 2 的4 次方,也就是可以表示 16 种状态,而这 16 种状态足够用来表示十进制里边可能会出现的 0- 9 这 10 种字符。
显然我们会有 6 种状态是冗余的,这就是BCD码的思路,每 4 个二进制位对应一个十进制的字符,这就可以让我们很方便的把BCD码转换成十进制,也可以把十进制快速的转成BCD码。
image.png

(2)8421码

1.介绍

我们要学习的第一种BCD码的编码方式叫做 8421 码。
刚才我们说过用4个二进制来表示1位十进制,这四个二进制位的权重分别是8421,也就是我们最熟悉的二进制的权值分配。
image.png
所以按照这样的设计,要表示十进制数就很简单。
比如表示5,应该是0101, 4 + 1 = 5;如果要表示 9 的话,就应该是1001。以此类推。
这张表给出了 0- 9 这几个数和 8421 码的一个相互映射的关系。
image.png
如果我们想要用这种 8421 码的策略来表示一个数,比如表示 985这个数 ,那么在计算机里存储这个数应该是这样的,9是1001,8是1000,5是0101。 那么985 这样的十进制数使用 8421 码最终在计算机内是1001 1000 0101这样来保存的,每4位对应1个十进制位。应该很好理解。

2.加法运算

接下来我们要探讨的问题是,使用 8421 码的策略来表示的数字应该怎么进行加法运算。

  • 手算

5 和 8 用 8421 码分别是这样的表示方式。 如下:
image.png
5 + 8 的结果应该是等于13。
所以如果用一个投机取巧人工计算的方式来计算,我们可以先用十进制算出它的结果,然后再把这个结果转换成对应的 8421 码,就可以。 13所对应的 8421 码应该是这样的表示。如下:
image.png
这是我们手动做题的时候可以采取的一个策略。先用十进制加出它的结果,然后再把这个结果转换成所对应的 8421 码。
但是如果我们丢给计算机来进行 8421 码的运算,就不能这么做了。

  • 计算机算

计算机的做法是这样的, 5 和 8 所对应的 8421 码分别是0101和1000这样的两串二进制,计算机会把加数和被加数丢给ALU算数逻辑单元,算术逻辑单元再进行加法运算之后,所得到结果应该是1101这样的。
image.png
关于二进制的加法,我们之前有简单的提及过,其实和十进制是有点类似的,就是对应位进行一个相加。
所以这两个数相加的结果应该是1101,如果把这个二进制数转换成十进制,应该是13。
但是现在问题来了,我们 8421 码当中合法的编码的区间应该是这样的一个范围,如下:
image.png
1100 已经超出了这个合法范围
所以在 8421 码中,如果我们的运算结果落在1010~1111这个区间内,是没有意义的。
为了让加法运算的结果符合 8421 码的规则定义,我们可以这样来处理。
当我们进行加法运算之后,如果结果落在了1010~1111这样的一个非法区间内,也就是落在了 10~15 这样的一个区间内。
我们可以在运算结果的基础上再加上6,因为4个二进制位只能表示 0~15 这样的几个数,所以对于 10~15 范围的数,我们再给它加上一个6,这4个二进制数肯定就会向高位进一个1,而低位留下的部分刚好又是我们所需要的个位的部分。
比如之前 的13 ,我们加上一个6,6用二进制表示应该是0110。相加之后得到的结果是这样的,向高位进了一个1,低位保留下来的数值 0011 转换成十进制,刚好是对应了 3 。高位的1,我们再在前边给它补上 3 个0,这样就可以刚好对应上 8421 码的 13 。
image.png
高四位表示1,低四位表示3,和我们这儿给出的映射关系是一样的。
这就是计算机处理 8421 码处理加法运算的一个方法。
image.png
如果两个数相加,得到的结果落在了一个非法区间内,那么我们需要加 6(0110) 进行一个修正。
当然,如果是 1 + 3 这样的操作, 0001 加上0010,所得到的结果是0100,这样的运算就不需要加 6 进行修正。


我们再来看一个课本上没有讲到的情况,比如 9 + 9,用 84211 码来进行计算, 9 + 9 应该是1001加上 1001。
image.png
你会发现,如果用 8421 码的 9 加上9,我们第一次加法运算得到的结果就是这样的一个数值,这个结果已经超出了 4 个 1 所能表示的范围,这种情况同样说明了我们用4位的 842 1码无法表示这两个数相加的值。
处理方法也是一样的,我们同样加上一个 6 进行修正
来看一下后四位 0010 加上6(0110) 进行修正,得到的结果应该是0001。
image.png
再补上我们之前得到的高位1。如下:
image.png

可以看到右边的这几个数(1000)刚好等于8;而左边高位的1,我们再在前边补上 3 个0(0001),这个数刚好是1。
而 9 + 9 = 18,和我们这儿修正后的结果是可以对应上的。
所以计算机在对 8421 码的两个十进制数进行加法运算的时候,有可能相加的结果是落在1010~10010这样的一个范围内。只要落在这个范围内,我们都需要进行加 6 的一个修正,都可以得到正确的结果。
这就是 8421 码的加法运算。

再次强调,如果加法运算的结果是落在了合法范围内,就不需要进行加 6 的修正。

(3)余3码

到目前为止,我们介绍了 8421 码,因为4个二进制数可以对应 16 种状态,我们把这 16 种状态的其中 10 种分别映射到 0- 9 这几个数字上。
如果我们修改一下映射的规则,我们就可以得到不同的编码方案。
image.png
比如课本上介绍了余 3 码,余 3 码的映射规则是 8421 码的基础上再加上3(0011),所以对于余 3 码来说, 0 数应该是0011,因为它是 8421 码的基础上再加上 0011 所得来的。
image.png
后续所有这些数都是一样的,都是在 8421 码的基础上加上了一个3,得到了一个新的映射方案,这就是所谓的余 3 码。
image.png
值得一提的是, 8421 码里边 4 个二进制位,每一个二进制位的权值都是固定不变的,分别是8、4、2、1。但是余3 马里边, 4 个二进制位,每一个二进制位其实并没有一个固定的权值。
所以像 8421 码这种,我们把它称为有权码,而余 3 码,我们把它称为无权码

(4)2421码

最后,我们还需要学习一种有权码,叫 2421 码
其实它的规则和 8421 是很类似的。我们会用4个二进制位来对应一个十进制位,只不过这四个二进制位的权值分别是2、4、2、1。
image.png
比如十进制的 3 对应的 2421 码应该是0011,后两个 1 的全值分别是 2 和 1,2 + 1刚好等于3;而 7 数的编码是1101,第一个 1 的权值是2,第二个 1 的权值是4,最后一个 1 的权值是1, 2 + 4 + 1 刚好等于7。
值得注意的是,对于 2421 码来说, 0~4 这个范围内所有的数字编码的第1位一定都是0;而 5~9 范围内所有的数字,编码的第1位都是1。
这个规定可以让 2421 码的这种编码策略达到一个统一。
比如对于 5 来说,我们完全可以 4 + 1 = 5,可以把它表示成0101。这看起来是一个合法的编码方案。
当然,我们也可以 2 + 2 + 1 等于5,所以 5 也可以用 1011 这样的方式来表示。
所以,也正是为了避免这种歧义的发生,2421 码规定,在 5 和 5 之后的所有数字,我们的首位一定必须是1
加上这个规则之后, 2421 码的编码就不会再有歧义了。

三、总结回顾

小结当中我们介绍了几种使用二进制来进行编码的十进制数的表示方式。
image.png
我们把它称为BCD码。
BCD码当中,每 4 个二进制位会对应一个十进制的数。
由于4个二进制位可以有 16 种不同的状态,我们把 16 种状态当中挑出 10 个来映射到 0 到 9 这几个数。
因此我们可以制定不一样的映射方案。
其中最重要也是最常用的就是 8421 码。 8421 表示的是每一位的权值。
需要注意的是,对 8421 码进行加法运算的时候,如果超出了合法的范围,我们需要加 6 进行修正,强制的向高位进1。
第二种余 3 码,其实就是在 8421 码的基础上加上 3 所得来的。余 3 码是一种无权码,各个二进制位是没有固定的权值。
最后我们又学习了 2421 码,其实原理和 8421 是类似的,只不过为了防止编码的时候出现歧义,所以会规定 0- 4 这几个数字的最高位一定是0,而 5- 9 的最高位一定是1。
以上就是这一小节的全部内容。

相关文章
|
5月前
|
C语言
|
6月前
|
缓存 NoSQL Java
你的码有我的码蠢?
你的码有我的码蠢?
45 0
|
Web App开发 编解码 数据建模
FOURCC四字符码对照表
FOURCC四字符码对照表
167 0
BCH码与RS码详解
BCH码与RS码详解
282 0
ASCII 码对照表(全)
ASCII 码对照表(全)
99 0
|
算法 C语言 芯片
【C语言】BCD码、十进制互相转换
【C语言】BCD码、十进制互相转换
770 0