BCD码详解

article/2025/10/26 8:42:45
BCD码的种类

BCD码可分为有权码和无权码两类:有权BCD码有8421码、2421码、5421码,其中8421码是最常用的;无权BCD码有余3码、格雷码等。
在这里插入图片描述

  1. 8421 BCD码
    8421 BCD码是最基本和最常用的BCD码,它和四位自然二进制码相似,各位的权值为8、4、2、1,故称为有权BCD码。和四位自然二进制码不同的是,它只选用了四位二进制码中前10组代码,即用0000~1001分别代表它所对应的十进制数,余下的六组代码不用。

  2. 5421 BCD码和2421 BCD码
    5421 BCD码和2421 BCD码为有权BCD码,它们从高位到低位的权值分别为5、4、2、1和2、4、2、1。这两种有权BCD码中,有的十进制数码存在两种加权方法,例如,5421 BCD码中的数码5,既可以用1000表示,也可以用0101表示;2421BCD码中的数码6,既可以用1100表示,也可以用0110表示。这说明5421BCD码和2421 BCD码的编码方案都不是惟一的,表1-2只列出了一种编码方案。

上表中2421 BCD码的10个数码中,0和9、1和8、2和7、3和6、4和5的代码对应位恰好一个是0时,另一个就是1。就称0和9、1和8互为反码。

  1. 余3 码
      余3码是8421 BCD码的每个码组加3(0011)形成的。常用于BCD码的运算电路中。

  2. Gray码(格雷码)
    Gray码也称循环码,其最基本的特性是任何相邻的两组代码中,仅有一位数码不同,因而又叫单位距离码。

Gray码的编码方案有多种,典型的Gray码如下表所示。从表中看出,这种代码除了具有单位距离码的特点外,还有一个特点就是具有反射特性,即按表中所示的对称轴为界,除最高位互补反射外,其余低位数沿对称轴镜像对称。利用这一反射特性可以方便地构成位数不同的Gray码。

BCD码的格式

计算机中的BCD码,经常使用的有两种格式,即分离BCD码,组合BCD码。

所谓分离BCD码,即用一个字节的低四位编码表示十进制数的一位,例如数82的存放格式为:

_ _ _1 0 0 0 _ _ _ _0 0 1 0 其中_表示无关值。

组合BCD码,是将两位十进制数,存放在一个字节中,例82的存放格式是10000010

BCD码的运算法则

由于编码是将每个十进制数用一组4位二进制数来表示,因此,若将这种BCD码直接交计算机去运算,由于计算机总是把数当作二进制数来运算,所以结果可能会出错。例:用3、BCD码求38+49。

解决的办法是对二进制加法运算的结果采用"加6修正,这种修正称为BCD调整。即将二进制加法运算的结果修正为BCD码加法运算的结果,两个两位BCD数相加时,对二进制加法运算结果采用修正规则进行修正。修正规则:

(1)如果任何两个对应位BCD数相加的结果向高一位无进位,若得到的结果小于或等于9,则该不需修正;若得到的结果大于9且小于16时,该位进行加6修正。

(2)如果任何两个对应位BCD数相加的结果向高一位有进位时(即结果大于或等于16),该位进行加6修正.

(3)低位修正结果使高位大于9时,高位进行加6修正

8421 BCD码举例说明

BCD码是一一对应的

如:十进制的123 用BCD表示为:0001 0010 0011

因为:十进制的 1 用二进制表示是 0001

十进制的 2 用二进制表示是 0010

十进制的 3 用二进制表示是 0011

BCD码和二进制的区别:123的二进制应该用短除法求得1111011由此可见,BCD码只是机械地用二进制表示十进制的每一位

压缩与非压缩

区别就是BCD码是8位的,浪费4位用0填充,压缩的BCD码是4位的,没有浪费

由于1字节有8bit(8个0或1)如果用一字节存储4位BCD码(其余补0)就是非压缩

如十进制的123:

非压缩码 00000001 00000010 00000011

压缩码 0001 0010 0011

C语言压缩bcd码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>/*
* 字符串转成bcd码,这个是正好偶数个数据的时候,如果是奇数个数据则分左靠还是右靠压缩BCD码
*/
intasc_to_bcd(char * dest,const char *src)
{unsigned char temp;while(*src !='\0'){temp = *src;*dest |=((temp&0xf)<<4);src++;temp = *src;*dest |= (temp&0xf);src++;dest++;}return 0;
}intasc_to_bcd_right(char *dest,const char *src,int src_len)
{unsigned char temp;if((src_len %2) !=0){*dest &= 0;temp = *src;*dest |= (temp&0xf);src++;dest++;}asc_to_bcd(dest,src);return 0;
}intasc_to_bcd_left(char *dest,const char *src,int src_len)
{unsigned char temp;if((src_len %2) !=0){dest[src_len-1] &=0;}asc_to_bcd(dest,src);return 0;
}voidprint_hex(char * bcd,int len)
{int i=0;for(i=0;i<len;i++){int n = 8;while(n--){if((bcd[i] &(0x1<<n))==0)printf("0");elseprintf("1");}putchar('\n');}
}intbcd_to_asc(char *dest,const char *src,int src_len)
{unsigned char temp;char *t = dest;while(src_len--){*t |= ((*src&0xf0)>>4);*t++ |= 0x30;*t |= (*src&0xf);*t++ |= 0x30;src++;}return 0;
}intleft_bcd_to_asc(char *dest,const char * src,int src_len)
{bcd_to_asc(dest,src,src_len);dest[src_len*2 -1] = '\0';return 0;
}intright_bcd_to_asc(char *dest,const char * src,int src_len)
{bcd_to_asc(dest,src,src_len);memmove(dest,dest+1,src_len*2-1);dest[src_len*2-1] = '\0';return 0;
}int main(void)
{char str[100];char *str1 = "1234567";int str_len = strlen(str1);int bcd_len = (str_len+1)/2;char *bcd = (char *)malloc(bcd_len);printf("str_len = %d\n",str_len);printf("bcd_len = %d\n",bcd_len);memset(bcd,0,bcd_len);memset(str,0,100);#if 0printf("右靠\n");asc_to_bcd_right(bcd,str1,str_len);print_hex(bcd,bcd_len);right_bcd_to_asc(str,bcd,bcd_len);printf("str = %s\n",str);
#endif#if 1printf("左靠\n");asc_to_bcd_left(bcd,str1,str_len);print_hex(bcd,bcd_len);//memset(str,0,100);left_bcd_to_asc(str,bcd,bcd_len);printf("str = %s\n",str);
#endifreturn 0;
}

http://chatgpt.dhexx.cn/article/KaEOxt00.shtml

相关文章

二进制码转BCD码

在单片机里面&#xff0c;如&#xff1a;显示个温度值&#xff0c;这时&#xff0c;要取一个数的个位、十位、百位&#xff0c;可以用/和 %&#xff08;求商和求余&#xff09;来解决。 但是&#xff0c;在FPGA里面用求商和求余将会非常消耗资源&#xff0c;这样就必须用到二进…

【C语言】BCD码、十进制互相转换

目录 0. 前言&#xff1a; 1. BCD码 2. 算法原理 3. 进制转换 3.1 两位BCD码的转换&#xff1a; 3.2 其他进制转换 3.3 任意进制转二进制 参考资料&#xff1a; 0. 前言&#xff1a; 记录今天用15单片机写DS1302时钟芯片程序的时候遇到的问题 时间显示是这个样的 0 1…

什么是 BCD(二进制编码的十进制)

BCD 是一位十进制数&#xff0c;由代表 0 到 9 的四位二进制数字表示。 当寄存器值以十六进制表示时&#xff0c;可以原样读取为十进制数&#xff0c;这对于处理十进制数的函数来说非常方便。 二进制数的 4 位可以表示为 0 到 15&#xff0c;但只有低 10 位被视为有效数字。 …

十进制转8421_BCD码

目录 一、BCD码简介 二、十进制转8421BCD码转换思路 三、程序编写 四、仿真验证 总结 一、BCD码简介 BCD码&#xff08;Binary-Coded Decimal‎&#xff09;&#xff0c;用4位二进制数来表示1位十进制数中的0~9这10个数码&#xff0c;是一种二进制的数字编码形式&#xff0c;常…

十进制数转换BCD码

有必要仔细阐述这一节&#xff0c;目前就是用在数码管显示&#xff0c;在单片机使用时&#xff0c;我们通常是将十进制数字进行/和%运算&#xff0c;得到每个位置的十进制数字&#xff0c;在这里可能是为了节省使用存储器的量&#xff0c;运用的是加三移位法具体其实就是将每个…

C语言:十进制、BCD码互换

目录 1、复杂版 2、简易版 最近写单片机 RTC 日期、时间配置&#xff0c;需要实现十进制、BCD码互换&#xff0c;将示例Demo分享给各位朋友&#xff1a; BCD是指用二进制来表示十进制数的编码&#xff0c;即&#xff1a;用4位二进制来表示一位十进制数&#xff0c;因此4位二进…

BCD码转化为十进制数

2019独角兽企业重金招聘Python工程师标准>>> 什么是BCD码&#xff1a;用4位二进制数来标识十进制数中的0-9这十个数的编码形式&#xff0c;简称为BCD码。BCD码优点&#xff1a;这种编码形式使二进制和十进制之间的转换能够快捷进行。采用BCD码&#xff0c;既可保存数…

BCD码以及各进制之间的相互转换

目录 前言 一、BCD码 二、进制互转 1、任意进制转十进制&#xff1a;系数X基数 ^ 权值&#xff08;累加&#xff09; 2、任意进制转二进制 前言 主要学习什么是BCD码&#xff0c;以及二进制、八进制、十进制、十六进制之间的相互转换 一、BCD码 BCD码就是以四位二进制数为一…

BCD码与十进制数间转换

一、前言&#xff1a; 这几天在项目协议对接的时候有一部分功能是获取系统时间功能与校时功能。小马哥获取到时间后打印了一下 2020-5-26 20:06:32&#xff0c;一看时间是对的&#xff0c;然后美滋滋的组装协议发送平台测试了。测试的时候发现月、日、时分秒数据都正常&#x…

黑马Python笔记3

输入时&#xff0c;占位符在引号里面&#xff0c;而要接受的变量在引号外面eg:"…%d"%player) expected an indented block&#xff1a;缩进错误。if对缩进有要求&#xff0c;python对缩进要求严格 if表判断 双等号一定要记住&#xff01;&#xff01;&#xff01; i…

2021-03-30 黑马Python学习笔记

操作系统OS&#xff08;Operation System&#xff09; 操作系统作用 1、直接操作硬件 2、把操作硬件的代码封装成系统调用&#xff0c;供其他成员间接操作硬件 没有安装操作系统的计算机被称为裸机 如果想在裸机上运行程序&#xff0c;必须用机器语言书写程序 如果计算机上…

黑马python在线培训

过去的2017年这一年&#xff0c;Python 开发者在全球快速增长&#xff0c;国内小伙伴学习 Python 的热情一路高涨。同时&#xff0c;Python 成为大量开发者推荐的入门编程语言和第二编程语言。2017年12月&#xff0c;Python 在 TIOBE 全球编程语言年度排行榜上升至第四&#xf…

黑马python培训安排

在分享资源之前&#xff0c;大家可以先想清楚未来的职业发展方向。毕竟只有找到未来职业发展方向&#xff0c;才更清楚当下重点学习的内容。 根据上图我们基本上一目了然&#xff0c;找到自己未来要发展的方向。在找到之后可以在各个招聘app上了解一下相关岗位的技能要求是什么…

[学习笔记]黑马程序员python教程

文章目录 思维导图Python基础知识图谱面向对象SQL入门和实战Python高阶技巧 第一阶段第九章&#xff1a;Python异常、模块与包1.9.1异常的捕获1.9.1.1 为什么要捕获异常1.9.1.2 捕获常规的异常1.9.1.3 捕获指定的异常1.9.1.4 捕获多个异常1.9.1.5 捕获全部异常1.9.1.6 异常的el…

黑马python6.0培训视频

关于对Python有一些了解的同学&#xff0c;肯定都会说Python语法简洁适合新手&#xff0c;便于阅读等这些方面。实际上是这样的&#xff0c;很多国内计算机专业都是C语言作为第一门学习的语言&#xff0c;很多国外的却是Python入门。因为Python可以让你在短时间内找到成就感&am…

黑马 Python 数据结构与算法第一章

背景知识 1.数组是一种线性表结构&#xff0c;其用一块连续的内存空间&#xff0c;来存储一组具有相同类型的数据&#xff1b; 2.时间复杂度&#xff0c;也叫做渐进时间复杂度&#xff0c;通常用大O公式书写&#xff0c;表示代码的执行时间随数据规模增长的变化趋势&#xff0c…

黑马程序员 python 数据分析 代码_2020年最新版 5.0程序员 黑马python人工智能数据分析机器学习软件测试全栈开发...

阶段一: 5.0课程资料 收起 第一章: 1-Python基础语法v5.0 第二章: 2-面向对象编程v5.0 第三章: 3-linux命令v5.0 第四章: 4-多任务编程v5.0 第五章: 5-web服务器v5.0 第六章: 6-web前端开发基础v5.0 第七章: 7-MySQL数据库v5.0 第八章: 8-mini-web框架v5.0 第九章: 9-django框架…

黑马python培训视频网盘下载

前几天看到朋友老周发了个朋友圈&#xff0c;我心态立马炸了&#xff1a; 好家伙&#xff01;竟然有钱入手五位数的最新款手机&#xff0c;这也太酸了吧&#xff01; 可他不是整天哭穷么&#xff0c;哪来这么多钱&#xff1f;我的内心充满了疑惑。 趁着昨天他来我家&#xff0c…

上海黑马python培训

过去的2017年这一年&#xff0c;Python 开发者在全球快速增长&#xff0c;国内小伙伴学习 Python 的热情一路高涨。同时&#xff0c;Python 成为大量开发者推荐的入门编程语言和第二编程语言。2017年12月&#xff0c;Python 在 TIOBE 全球编程语言年度排行榜上升至第四&#xf…

黑马Python笔记4

命名的时候宜严格按照要求&#xff0c;不易出现空格宜使用_ 调用函数时&#xff0c;创建新项目的时候选择新窗口&#xff0c;否则出错。 定义函数的格式 def 函数名&#xff08;&#xff09;&#xff1a;函数的命名字母数字下划线 … 调用函数:函数名&#xff08;&#xff09; …