BCD码
- BCD: Binary-Coded Decimal, 使用二进制编码的十进制
- 常用三种BCD码
BCD码的作用
- 二进制数是比较方便让计算机来处理的,但是十进制数又比较符合我们人类的一个阅读习惯
- 如果我们想把二进制转换成十进制的话,可以用每一个数码位乘以这个数码位上的权值进行一个相乘相加的操作,就可以转换成与之对应的10进制的值
- 使用这种方式把机器转换成我们熟悉的十进制数是比较麻烦的,BCD码就是为了解决这个问题
用BCD码来表示数字的原理
- 我们可以用4个二进制位也就4个bit的信息来对应上一个10进制位,
- 因为4个二进制位可以表示的状态是
2
4
2^4
24也就是可以表示16种状态
- 而这16种状态就足够用来表示10进制里面可能会出现的0~9这10种字符
- 那显然我们会有6种状态是冗余的
8421码
- 用4个二进制来表示一位十进制,那么这4个二进制位的权重分别是:8421,也就是我们最熟悉的二进制的权值的分配
- 所以按照这样的设计,我们要表示10进制的数比如5的话,那么就应该是: 0101(B)=5(D)
- 如果要表示9的话就应该是: 1001(B) = 9
- 以此类推…
映射关系如下
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|
0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 |
- 那这张表给出了0~9这几个数和8421码的一个相互映射的关系
- 如果我们想要用这种8421码的策略来表示一个数,比如说表示表示985这个数
- 那在计算机里存储这个数据是:1001 1000 0101
使用8421码的策略来表示的数字应该怎么进行加法运算
- 十进制加法: 5 + 8 = 13
- 8421码加法:0101 + 1000 = 0001 0011
- 手工做题可以将13转换成二进制,之后转化成8421码
- 计算机如何计算?
- 计算机把加数和被加数丢给ALU算术逻辑单元
- 算术逻辑单元进行加法运算之后, 得到结果是 1101
- 但是结果并不在上述映射表中, 也就是在8421码中 1010 ~ 1111 没有定义
- 为了让加法运算的结果符合8421码的一个规则定义,当我们进行加法运算之后
- 如果结果落在了这样的一个非法区间内,也就是落在了10~15这样的一个区间内
- 我们可以在这个运算结果的基础上再加上6,因为4个二进制位只能表示0~15这样的几个数
- 所以对于10~15这个范围的数,我们再给它加上一个6,这4个二进制数肯定就会向高位进一个一
- 而低位留下的部分刚好是我们所需要的个位的部分,比如之前13这个数我们加上一个6
- 6用二进制表示是0110,相加之后得到的结果是这样的:1101 + 0110 = 10011 = 0001 0011
- 向高位进了一个1,然后低位保留下来的数值,0011转换成十进制刚好是对应了3
- 那高位的1,我们在前边给他补上三个0, 这样的话就可以刚好对应上8421码的13这个数
- 高4位表示1,低4位表示3,和我们这儿给出的映射关系是一样的,那这就是计算机处理8421码加法运算的一个方法
- 8421码总结
- 如果两个数相加得到的结果落在了一个非法区间内,那么我们需要加6进行一个修正
- 但如果是1+3这样的一个操作0001+0010,那么所得的结果是0100,这样的运算就不需要加6进行修正
- 其他情况,比如说9+9,用8421码来进行计算,9+9(D) = 1001 + 1001 = 10010, 这个值已经超出了1111
- 这种情况用4位的8421码无法表示这两个数相加的一个值,处理方法也是一样的,我们同样加上一个6进行修正
- 后4位的0010加上6进行修正: 0010 + 0110 = 1000
- 再补上我们之前的高位1, 得到: 0001 1000
- 那么可以看到右边的这4个数刚好是等于8
- 而左边高位的1我们在这前边补上3个0的话,那这个数刚好又是1
- 9+9=18和我们修正后的结果是可以对应上的
- 所以计算机在对8421码的两个十进制数进行加法运算的时候,有可能相加的结果是落在1010 ~ 10010这样的一个范围内
- 只要落在这个范围内,我们都需要进行加6的一个修正,都可以得到正确的结果
- 如果加法运算的结果是落在了合法范围内(上述映射表),那么就不需要进行加6的修正
- 8421码,因为4个二进制数可以对应16种状态,我们把这16种状态的其中10种分别映射到0~9这几个数字上
- 如果我们修改一下映射的规则,我们就可以得到不同的编码方案, 比如余3码
余3码
- 余三码的映射规则是8421码的基础上再加上3,即:8421码 + (0011)B,0000 + 0011 = 0011
- 对于余3码来说, 0这个数应该是0011,因为它是8421码的基础上再加上0011所得来的
- 后续所有这些数据都是一样的,都是在8421码的基础上加上了一个3, 得到了一个新的映射方案
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|
0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 |
- 8421码里边4个二进制位,每一个二进制位的权值都是固定不变的,分别是8,4,2,1
- 但是余3码里面, 4个二进制位,每一个二进制位,其实并没有一个固定的权值
- 所以像8421码这种,我们把它称为有权码,而余3码我们把它称为无权码
2421码
- 2421码是有权码
- 其实它的规则和8421是很类似的,我们会用4个二进制位来对应一个十进制位,只不过这次的二进制位的权值分别是2,4,2,1
- 比如十进制的3对应的2421码应该是0011,那么后两个1的权值分别是2和1,2+1刚好等于3
- 而7这个数的编码是1101,第1个1的权值是2,第2个1的权值是4,最后一个1的权值是1,2+4+1=7
- 那值得注意的是,对于2421马来说,0~4这个范围内,所有的数字编码的第1位一定都是0
- 比如:0000,0001,0010,0011,0100,
- 而5~9这个范围内所有的数字编码的第1位都是1
- 比如:1011,1100,1101,1110,1111
- 这个规定可以让2421码的这种编码策略达到一个统一
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|
0000 | 0001 | 0010 | 0011 | 0100 | 1011 | 1100 | 1101 | 1110 | 1111 |
- 比如说对于5这个数来说,我们完全可以4+1=5, 那么我们可以把它表示成0101,这看起来是一个合法的编码方案
- 当然我们也可以2+2+1=5,所以5也可以用1011这样的方式来表示,所以也正是为了避免这种歧义的发生
- 因此2421码规定在5和5之后的所有数字,我们的首位一定必须是1,加上这个规则之后,2421码的编码就不会再有歧义了
总结
- BCD码
- 8421码
- 每4个二进制位对应一个十进制位(有6个冗余状态)
- 8, 4, 2, 1 分别对应每一位的权值
- 0000 ~ 1001 分别对应 0 ~ 9,进行加法后若超出该范围,则需 + 0110 进行修正,即:强制向高位进1
- 余3码
- 2421码
- 2, 4, 2, 1 分别对应每一位的权值
- 表示 0 ~ 4 时最高位为0,表示 5 ~ 9 时最高位为1