BCD码
- 导读
- 一、编码
- 1.1 什么是编码?
- 1.2 编码机制
- ASCII码
- 非ASCII编码
- Unicode
- 二、 `BCD`码
- 2.1 8421码
- 小结
- 2.2 余3码
- 2.3 2421码
- 2.4 总结
- 结语
导读
大家好,很高兴又和大家见面啦!!!
在上一篇内容中我们介绍了不同的进位计数制及其相互转换的内容:
- 任意进制转十进制——按权展开相加法
- 十进制转任意进制:
- 整数部分:除基取余法
- 小数部分:乘基取整法
- 二进制、八进制与十六进制的相互转换:分组转换法
- 二进制转八进制——将二进制数码3个为一组进行分组,然后再进行转换
- 八进制转二进制——对八进制的数码从右到左逐一进行转换
- 二进制转十六进制——将二进制数码4个为一组进行分组,然后再进行转换
- 十六进制转二进制——将十六进制数码从右到左逐一进行转换
- 具体的转换方法:
- 二进制转八进制或十六进制:
- 直接转换法:通过八进制(十六进制)的数码对应的二进制编码,直接进行转换
- 按权展开相加法:将完成分组后的二进制的数码按权展开相加
- 八进制或十六进制转二进制:
- 直接转换法:将八进制(十六进制)的每一位数码根据对应的二进制编码进行直接转换
- 除基取余法:将八进制(十六进制)的每一位数码进行除基取余,必要时在最高位补0
- 二进制转八进制或十六进制:
通过上一篇的内容我们知道了同一个数在不同的进制下所表示的数值是不相同的,同理,同一个式子,在不同进制下的运算结果也是不相同的。
数制的内容经过上一个篇章,我们基本上已经全部介绍完了,接下来我们将会进入编码的内容介绍。在今天的内容中我们将会介绍几种以二进制来表示十进制的编码方式,那么具体有哪些编码方式,并且这些编码方式又是如何来通过二进制表示十进制的呢?下面就让我们一起进入今天的内容吧!!!
一、编码
1.1 什么是编码?
编码是信息从一种形式或格式转换为另一种形式的过程,也称为计算机编程语言的代码简称编码。用预先规定的方法将文字、数字或其它对象编成数码,或将信息、数据转换成规定的电脉冲信号,这个方法就是编码机制。1
1.2 编码机制
ASCII码
在在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状态,这被称为一个字节(byte)。
也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从0000000到11111111。
上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之的关系,做了统一规定。这被称为ASCII码,一直沿用至今。
ASCII码一共规定了128个字符的编码,比如空格 SPACE 是32(二进制0010 0000
),大写的字母A
是65(二进制0100 0001
)。
这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统规定为0。1
非ASCII编码
英语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示。
于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的6的编码为130(二进制10000010)。
这样一来,这些欧洲国家使用的编码体系,最多可以表示256个符号。
但是,这里又出现了新的问题。
不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了ě
,在希伯来语编码中却代表了字母Gimel()
,在俄语编码中又会代表另一个符号。
但是不管怎样,所有这些编码方式中,0-127表示的符号是一样的,不一样的只是128-255的这一段。
至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号比如,简体中文常见的编码方式是GB2312
,使用两个字节表示一个汉字,所以理论上最多可以表示
256
×
256
=
65536
256 × 256=65536
256×256=65536 个符号。
这里指出,虽然都是用多个字节表示一个符号,但是GB类的汉字编码与Unicode
和UTF-8
是毫无关系的。1
Unicode
世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。
因此,要想打开一个文本文件,就必须知道它的编码方式否则用错误的编码方式解读,就会出现乱码。
为什么电子邮件常常出现乱码?
是因为发信人和收信人使用的编码方式不一样。
可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。
这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。
Unicode当然是一个很大的集合,规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639
表示阿拉伯字母Ain
,U+0041
表语的大写字母A
,U+4E25
表示汉字"严"
。1
二、 BCD
码
在进制的相互转换中我们知道,对于八进制和十六进制的数,我们可以直接通过二进制来进行表示:
- 3个二进制数码可以表示一个八进制数码
- 4个二进制数码可以表示一个十六进制数码
正因为他们之间的这种关系,这就使得二进制与八进制或十六进制之间的相互转换变的更加方便,并且八进制与十六进制的相互转换,如果借助二进制后,也会变的特别方便。
因此,如果我们能通过某种编码方式来用二进制表示十进制的话,这样就能够更加方便的实现二进制与十进制之间的相互转换,这种通过二进制来表示十进制的编码方式我们就将其称为BCD
码。
BCD
码(Binary-Coded Decimal, BCD
)——二进制编码的十进制数。这种编码方式通常采用4位二进制数来表示一位十进制数码。但是4位二进制数可以组合出16种代码,因此必定会有6中状态为冗余状态。
今天我们主要会介绍三种BCD
码:
- 8421码
- 余3码
- 2421码
接下来我们就来逐一了解这三种编码方式;
2.1 8421码
8421码是我们常用的一种BCD
码,它是一种有权码。
顾名思义,在8421码中,4个二进制的权值从高到低依次为: 8 、 4 、 2 、 1 8、4、2、1 8、4、2、1 。
假设各位的数值分别是
b
3
、
b
2
、
b
1
、
b
0
b_3、b_2、b_1、b_0
b3、b2、b1、b0 ,那么通过84321码表示的十进制数则是:
D
=
8
b
3
+
4
b
2
+
2
b
1
+
1
b
0
D=8b_3+4b_2+2b_1+1b_0
D=8b3+4b2+2b1+1b0
如二进制数
(
1000
)
2
(1000)_2
(1000)2 通过8421码表示的十进制数则是:
D
=
8
×
1
+
4
×
0
+
2
×
0
+
1
×
0
=
(
8
)
10
D=8×1+4×0+2×0+1×0=(8)_{10}
D=8×1+4×0+2×0+1×0=(8)10
在比如二进制数
(
1001
)
2
(1001)_2
(1001)2 通过8421码表示的十进制数则是:
D
=
8
×
1
+
4
×
0
+
2
×
0
+
1
×
1
=
(
9
)
10
D=8×1+4×0+2×0+1×1=(9)_{10}
D=8×1+4×0+2×0+1×1=(9)10
这时对于 ( 1010 ) 2 (1010)_2 (1010)2 、 ( 1011 ) 2 (1011)_2 (1011)2 、 ( 1100 ) 2 (1100)_2 (1100)2 、 ( 1101 ) 2 (1101)_2 (1101)2 、 ( 1110 ) 2 (1110)_2 (1110)2 、 ( 1111 ) 2 (1111)_2 (1111)2 这六种二进制编码在十六进制中它们可以表示十六进制数 a ~ f a~f a~f ;但是在十进制中,它们没有任何意义,所以它们六种编码属于无效码。
因此当我们通过8421码进行十进制的加法运算时,不是上述有效码之一时,我们就需要通过加上6来进行修正。
如 ( 0001 ) 2 + ( 1000 ) 2 = ( 1001 ) 2 (0001)_2 + (1000)_2 = (1001)_2 (0001)2+(1000)2=(1001)2 对应的十进制运算则是 1 + 8 = 9 1 + 8 = 9 1+8=9 此时是不需要进行修正的。
如 ( 1000 ) 2 + ( 0111 ) 2 = ( 1111 ) 2 (1000)_2 + (0111)_2 = (1111)_2 (1000)2+(0111)2=(1111)2 对应的十进制运算则是 8 + 7 = 15 8 + 7 = 15 8+7=15 ,此时的编码 ( 1111 ) 2 (1111)_2 (1111)2 属于无效编码,因此需要继续加上一个6,也就是对应的 ( 0110 ) 2 (0110)_2 (0110)2 来进行编码修正,修正的结果为: ( 1111 ) 2 + ( 0110 ) 2 = ( 10101 ) 2 (1111)_2+(0110)_2=(1 0101)_2 (1111)2+(0110)2=(10101)2
现在有朋友可能就看不懂 ( 10101 ) 2 (1 0101)_2 (10101)2 这种编码是如何表示 ( 15 ) 10 (15)_{10} (15)10 这个十进制数值的,这里实际上和二进制表示十六进制一样,通过每4位二进制数来表示一个十进制的数码,因此它实际上是分别表示的 ( 1 ) 10 (1)_{10} (1)10 和 ( 5 ) 10 (5)_{10} (5)10 这两个十进制数码,因此如果我们在高位补上3个0,那我们就得到了 ( 15 ) 10 (15)_{10} (15)10 这个数值的完整的8421编码 ( 00010101 ) 2 (0001 0101)_2 (00010101)2 如下图所示:
也就是说,当我们通过BCD
编码来表示十进制数时,我们是通过4位二进制数码表示十进制数值中的每一位数码。
这里我们再举一个例子,如 ( 520 ) 10 (520)_{10} (520)10 这个十进制数所对应的8421编码为: ( 0101 − 0010 − 0000 ) 2 (0101-0010-0000)_2 (0101−0010−0000)2
小结
在8421码中,我们应该需要掌握以下内容:
- 8421码是一种通过4位二进制数码表示1位十进制数码的编码方式;
- 8421码是一种带权码,这里的权值是指的二进制位的权值,在4位二进制数码中,其权值从高到低依次是 2 3 = 8 、 2 2 = 4 、 2 1 = 2 、 2 0 = 1 2^3 = 8、2^2 = 4、2^1=2、2^0=1 23=8、22=4、21=2、20=1 ;
- 4位二进制数码总共可以有16种编码形式,因此不在 0000 ~ 1001 0000~1001 0000~1001 这10种编码中的就属于无效码;
- 在涉及到加法运算时,如果直接通过8421编码进行运算,那我们就需要注意对于无效码进行
+6
的修正; - 在涉及到运算时,我们可以先通过十进制获取运算结果,再将运算结果的每一位十进制数码以8421码的形式表示;
2.2 余3码
余3码是在8421码的基础上加上 ( 0011 ) 2 (0011)_2 (0011)2 也就是 ( 3 ) 10 (3)_{10} (3)10 形成的。因为每一位十进制的数码对应的二进制编码都多余一个 3 3 3 因此这种编码形式被称为余3码。
余3码与8421码之间还是有一定的区别的,在余3码中,各个数位上并没有一个固定的权值,因此余3码也是一种无权码。
因此余3码的获取我们可以通过8421码来间接的进行获取。
如
(
520
)
10
(520)_{10}
(520)10 所对应的8421码 :
(
0101
−
0010
−
0000
)
2
(0101-0010-0000)_2
(0101−0010−0000)2
再对每一组数码进行+
(
0011
)
2
(0011)_2
(0011)2 就得到了对应的余3码:
(
1000
−
0101
−
0011
)
2
(1000-0101-0011)_2
(1000−0101−0011)2
2.3 2421码
2421码与8421码相同,也是一种有权码,权值由高到低分别为: 2 、 4 、 2 、 1 2、4、2、1 2、4、2、1 。不过在2421码中规定:大于或等于5的4位二进制数中的最高位为1,小于5的最高位为0,如下所示:
与8421码不同的是,在进行加法运算时,8421码的运算结果如果不是有效码,那么就需要通过+6修正,并且这里的有效码只有十种,因此涉及到进位的运算都是需要进行+6修正的,也就是说,运算结果大于10的都需要进行+6修正。
但是在2421码中,修正的方式则不一样。
在2421码中,十进制数码对应的2421编码应该严格遵守2421码的特点:
- 大于或等于5的4位二进制数最高位为1
- 小于5的4位二进制数最高位为0
也就是说,当我们进行
(
2
)
10
+
(
4
)
10
=
(
6
)
10
(2)_{10}+(4)_{10}=(6)_{10}
(2)10+(4)10=(6)10 的运算时,对应的2421编码的运算为:
(
0010
)
2
+
(
0100
)
2
=
(
0110
)
2
(0010)_2+(0100)_2=(0110)_2
(0010)2+(0100)2=(0110)2
根据位权值计算的话,我们不难发现,其结果所对应的值为 2 × 0 + 4 × 1 + 2 × 1 + 1 × 0 = 6 2×0+4×1+2×1+1×0=6 2×0+4×1+2×1+1×0=6
但是此时的编码并不满足2421的特点,因此我们需要在这个编码的基础上+
(
0110
)
2
(0110)_2
(0110)2 即可得到:
(
0110
)
2
+
(
0110
)
2
=
(
1100
)
2
(0110)_2+(0110)_2=(1100)_2
(0110)2+(0110)2=(1100)2
此时的二进制编码就符合2421的编码要求。
同理,当我们进行
(
5
)
10
+
(
9
)
10
=
(
14
)
10
(5)_{10}+(9)_{10}=(14)_{10}
(5)10+(9)10=(14)10 的运算时,对应的2421编码的运算为:
(
1011
)
2
+
(
1111
)
2
=
(
11010
)
2
(1011)_2+(1111)_2=(11010)_2
(1011)2+(1111)2=(11010)2
此时我们需要单独看每一组二进制编码是否符合要求,比如这里的
(
11010
)
2
(11010)_2
(11010)2 我们将其在高位补完0后得到的两组二进制编码分别是
(
0001
)
2
(0001)_2
(0001)2 与
(
1010
)
2
(1010)_2
(1010)2 ,显然,第一组二进制编码
(
0001
)
2
(0001)_2
(0001)2 是符合2421编码的要求的,但是第二组二进制编码
(
1010
)
2
(1010)_2
(1010)2 对应的数值为4,其最高位应该为0,因此并不符合2421的编码要求,因此我们需要在这个编码的基础上-
(
0110
)
2
(0110)_2
(0110)2 即可得到:
(
1010
)
2
−
(
0110
)
2
=
(
0100
)
2
(1010)_2-(0110)_2=(0100)_2
(1010)2−(0110)2=(0100)2
此时的编码就符合2421的编码要求。
也就是说在2421码的修正中,我们应该对每一位数值对应的2421编码进行修正,而不是对数值对应的整体进行修正,如下所示:
可以看到,在这个例子中,
(
25
)
10
+
(
49
)
10
=
(
74
)
10
(25)_{10}+(49)_{10}=(74)_{10}
(25)10+(49)10=(74)10 ,直接通过2421码进行加法运算的话,我们会发现,
(
7
)
10
(7)_{10}
(7)10 与
(
4
)
10
(4)_{10}
(4)10 所对应的2421码都是无效码,因此我们需要分别对
(
7
)
10
(7)_{10}
(7)10 进行+
(
0110
)
2
(0110)_2
(0110)2 的修正以及对
(
4
)
10
(4)_{10}
(4)10 进行-
(
0110
)
2
(0110)_2
(0110)2 的修正,最后才能够得到
(
74
)
10
(74)_{10}
(74)10 正确的2421编码
(
11010100
)
2
(11010100)_2
(11010100)2。
2.4 总结
对于BCD
码不同的编码方式,其编码的核心是通过4位二进制数码来表示一位十进制数码,因此对于十进制数码转BCD
码时,我们就需要将每一位十进制数码逐一的转成其所对应的BCD
编码;
在涉及到运算时,最简单的转码方式就是通过十进制完成运算后,再对其结果进行转码;如果采用对应的BCD
码进行运算时,则需要考虑无效码的修正的问题。
结语
在今天的内容中我们介绍了BCD
码的相关内容:
- 8421码是一种常用的有权码,其编码的加法运算中对无效码需要进行+ ( 0110 ) 2 (0110)_2 (0110)2 的修正;
- 余3码是在8421的基础上进行+ ( 0011 ) 2 (0011)_2 (0011)2 的一种无权码;
- 2421码是不同于8421码的一种有权码,其编码的修正方式是对每一组无效码进行修正;
最后给大家奉上一个BCD
码转换器:BCD码转换器。有需要的朋友可以通过该转换器来验证不同的数值的BCD
编码。
今天的内容到这里就全部结束了,在下一篇内容中我们将介绍《无符号整数》的相关内容,大家记得关注哦!如果大家喜欢博主的内容,可以点赞、收藏加评论支持一下博主,当然也可以将博主的内容转发给你身边需要的朋友。最后感谢各位朋友的支持,咱们下一篇再见!!!
编码机制 ↩︎ ↩︎ ↩︎ ↩︎