【计算机组成原理】你知道什么是8421码、什么是余3码什么又是2421码吗?今天这篇文章带你认识计算机中的BCD码

news2024/9/20 7:28:14

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类的汉字编码与UnicodeUTF-8是毫无关系的。1

Unicode

世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。

因此,要想打开一个文本文件,就必须知道它的编码方式否则用错误的编码方式解读,就会出现乱码。

为什么电子邮件常常出现乱码?

是因为发信人和收信人使用的编码方式不一样。

可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。

这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。

Unicode当然是一个很大的集合,规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母AinU+0041表语的大写字母AU+4E25表示汉字"严"1

二、 BCD

在进制的相互转换中我们知道,对于八进制和十六进制的数,我们可以直接通过二进制来进行表示:

  • 3个二进制数码可以表示一个八进制数码
  • 4个二进制数码可以表示一个十六进制数码

正因为他们之间的这种关系,这就使得二进制与八进制或十六进制之间的相互转换变的更加方便,并且八进制与十六进制的相互转换,如果借助二进制后,也会变的特别方便。

因此,如果我们能通过某种编码方式来用二进制表示十进制的话,这样就能够更加方便的实现二进制与十进制之间的相互转换,这种通过二进制来表示十进制的编码方式我们就将其称为BCD码。

BCD码(Binary-Coded Decimal, BCD)——二进制编码的十进制数。这种编码方式通常采用4位二进制数来表示一位十进制数码。但是4位二进制数可以组合出16种代码,因此必定会有6中状态为冗余状态。

今天我们主要会介绍三种BCD码:

  1. 8421码
  2. 余3码
  3. 2421码

接下来我们就来逐一了解这三种编码方式;

2.1 8421码

8421码是我们常用的一种BCD码,它是一种有权码。

顾名思义,在8421码中,4个二进制的权值从高到低依次为: 8 、 4 、 2 、 1 8、4、2、1 8421

假设各位的数值分别是 b 3 、 b 2 、 b 1 、 b 0 b_3、b_2、b_1、b_0 b3b2b1b0 ,那么通过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

8421码

这时对于 ( 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 af ;但是在十进制中,它们没有任何意义,所以它们六种编码属于无效码。

因此当我们通过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 如下图所示:

8421码
也就是说,当我们通过BCD编码来表示十进制数时,我们是通过4位二进制数码表示十进制数值中的每一位数码。

这里我们再举一个例子,如 ( 520 ) 10 (520)_{10} (520)10 这个十进制数所对应的8421编码为: ( 0101 − 0010 − 0000 ) 2 (0101-0010-0000)_2 (010100100000)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=822=421=220=1 ;
  • 4位二进制数码总共可以有16种编码形式,因此不在 0000 ~ 1001 0000~1001 00001001 这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码
因此余3码的获取我们可以通过8421码来间接的进行获取。

( 520 ) 10 (520)_{10} (520)10 所对应的8421码 : ( 0101 − 0010 − 0000 ) 2 (0101-0010-0000)_2 (010100100000)2
再对每一组数码进行+ ( 0011 ) 2 (0011)_2 (0011)2 就得到了对应的余3码: ( 1000 − 0101 − 0011 ) 2 (1000-0101-0011)_2 (100001010011)2

2.3 2421码

2421码与8421码相同,也是一种有权码,权值由高到低分别为: 2 、 4 、 2 、 1 2、4、2、1 2421 。不过在2421码中规定:大于或等于5的4位二进制数中的最高位为1,小于5的最高位为0,如下所示:

2421码
与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编码进行修正,而不是对数值对应的整体进行修正,如下所示:

2421码2
可以看到,在这个例子中, ( 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编码。

今天的内容到这里就全部结束了,在下一篇内容中我们将介绍《无符号整数》的相关内容,大家记得关注哦!如果大家喜欢博主的内容,可以点赞、收藏加评论支持一下博主,当然也可以将博主的内容转发给你身边需要的朋友。最后感谢各位朋友的支持,咱们下一篇再见!!!


  1. 编码机制 ↩︎ ↩︎ ↩︎ ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2106540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

github中action作用和讲解

1,简介 GitHub Actions 是 GitHub 的一个自动化功能,它允许你在 GitHub 仓库中自动执行软件开发工作流程。你可以使用 GitHub Actions 来执行各种任务,比如: 自动测试:每当代码被推送到仓库时,自动运行测试…

学生公寓单相费控电表的规格如何选择

石家庄光大远通电气有限公司学生公寓单相费控电表功能支持时间管理控制。L1、L2、L3可分别设置为工作日和节假日模式,每天多可设置8个时间段,每个时间段可分别设置为合闸状态或夜间模式,合闸时间段内电表保持合闸,夜间时间段内&am…

手机玩机常识-----小米系列机型 Android 15 更新计划 那些机型将会更新安卓15

小米机型是很多米粉最喜欢把玩的,其中解锁bl root 刷写twrp以及刷第三方系统资源相对其他品牌机型来说比较丰富。目前安卓15快要更新到很多机型。我们来了解下小米系列机型的更新计划是咋样的 小米会定期更新有关 Redmi红米 设备的支持日期的数据,包括可…

如何使用Spoon连接data-integration-server并在服务器上执行转换

1.建立连接 2.新建转换或任务 3.右键[子服务器],新建一个服务器连接(data-integration-server服务器的连接信息) 4.右键[Run configurations],新建一个执行连接,勾选相应的选项即可: 5.选择服务器运行即可! 6.最后,你可以通过服务器端的WEB查看执行日志…

Kafka【八】如何保证消息发送的可靠性、重复性、有序性

【1】消息发送的可靠性保证 对于生产者发送的数据,我们有的时候是不关心数据是否已经发送成功的,我们只要发送就可以了。在这种场景中,消息可能会因为某些故障或问题导致丢失,我们将这种情况称之为消息不可靠。虽然消息数据可能会…

zoom缩放导致下拉框定位偏移问题

因为浏览器升级修改了zoom导致 https://developer.chrome.google.cn/release-notes/128?hlzh_tw 可根据zoom值计算相差偏移量 const isChromeHighVersion () > {const ua navigator.userAgent.toLowerCase();const chromeIndex ua.indexOf(chrome);if (chromeIndex >…

跑步戴的耳机哪个品牌的好?精选五款热门品牌骨传导耳机分享

近年来,骨传导耳机逐渐成为了人们喜爱的耳机之一。相比于传统的耳机,骨传导耳机不需要使用耳塞,就可以让用户在运动时更加自由自在,不受耳机带来的束缚感。然而,市面上的骨传导耳机品牌和型号众多,质量参差…

如何把大的txt文件拆分为小的文件?

命令:split 1. 功能:这个是一个Linux 命令,功能是一个大文件分割成多个较小的文件。 可以使用该命令的系统:在Linux 终端,或者是windows git bash 端口。 官方说明:在Linux 终端,或者是…

【生成模型系列(中级)】词向量维度选择的奥秘——从理论到实验的揭秘【通俗理解,代码模拟】

【通俗理解】词向量维度选择的奥秘——从理论到实验的揭秘 关键词提炼 #词向量 #维度选择 #最小熵原理 #Johnson-Lindenstrauss引理 #注意力机制 #图网络 第一节:词向量维度选择的类比与核心概念【尽可能通俗】 1.1 词向量维度选择的类比 词向量维度选择就像为一…

Git 使用指南 --- 版本管理

序言 Git 是一个开源的 分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。对一个程序员来说,掌握 Git 的使用是必要的。  在这个系列中,将详细的介绍 Git 的使用和原理,话不多说,让我们开始吧。…

C# 加解密之DES

说完了对称加密中的AES,这一篇再来介绍下DES。加解密原理什么的就不介绍了,大家可以自行百度(主要我也不太明白,也不需要太明白),大致说一下两者的区别吧! 首先肯定是加密算法的不同&#xff0…

模型大师们!答应我把这8本书翻烂好嘛?

模型大师们,准备好踏上一段深度学习与模型构建的路了吗? 这里有八本经典之作,它们将是你攀登知识高峰的阶梯! 从《PyTorch深度学习实战》到《大模型时代》 从掌握基础框架到洞悉大模型时代的变革 模型大师,准备好了吗&#xff…

RabbitMQ核心架构

RabbitMQ架构设计 Producer:负责产生消息。 Connection:RabbitMQ客户端和代理服务器之间的TCP连接。 Channel:建立在连接之上的虚拟连接,RabbitMQ操作都是在信道中进行。 Broker:一个Broker可以看做一个RabbitMQ服…

TP5发送邮件功能如何实现?怎么配置服务?

TP5发送邮件性能优化如何优化?怎么使用TP5发送邮件? 在现代Web开发中,TP5框架因其高效和灵活性而广受欢迎。无论是用于用户注册验证、密码重置还是定期通知,TP5发送邮件功能都能提供强大的支持。AokSend将详细介绍如何在TP5框架中…

开放式耳机和骨传导耳机哪个好?2024年开放式耳机排行榜10强

随着耳机市场的不断发展,开放式耳机和骨传导耳机逐渐成为两大热门选择。无论是追求高音质还是重视佩戴舒适度,消费者在选购耳机时都面临着一个重要问题:开放式耳机和骨传导耳机到底哪个更好?今天我们就来深入对比这两种耳机的优缺…

顶会最高分的文章怎么写?基于CNN的时间序列新SOTA就是最好的答案!

【时间序列CNN】(卷积神经网络)在近年来的深度学习领域中备受关注,它通过将卷积神经网络应用于时间序列数据,显著提升了模型在特征提取和模式识别任务中的表现。时间序列CNN技术已经在金融预测、健康监测和工业设备故障检测等多个…

竟然有50万个使用Flutter开发的应用了,这也太牛了!

近期工作比较清闲,在Flutter和React Native两者中犹豫学习哪个,做了不少功课,最终决定入手Flutter。原因很简单,感觉Flutter更有前景,另外B站也找到了适合自己学习的Flutter免费教程,天时地利人和&#xff…

进程的那些事——了解进程(虚拟地址空间)

目录 前言 一、程序地址空间(虚拟地址空间) 二、虚拟地址寻找物理内存 1.页表 总结 前言 提示:这里可以添加本文要记录的大概内容: 程序和进程之间的区别: 进程:对用户而言,进程是运行中的…

写卡片可以成为专家吗?

前一段,一位同学问我: 写小卡片记录巅峰,积少成多就一定能成为行业专家了吗? 我的观点如下: 想成为行业专家,我认为要有两类卡片: 1. 对同行专家知识学习后,所写的卡片。比如&am…

【专项刷题】— 字符串

1、最长公共前缀 - 力扣(LeetCode) 思路: 解法一:两两比较字符串解法二:比较每一个字符串的同一位图解:代码: class Solution {public String longestCommonPrefix(String[] strs) {String ret …