BCD码(Binary-Coded Decimal),用4位
二进制数
来表示1位
十进制数
中的0~9这10个数码,是一种二进制的数字编码形式,用
二进制编码的十进制
代码。BCD码这种编码形式利用了四个位元来储存一个十进制的数码,使
二进制
和
十进制
之间的转换得以快捷的进行。这种编码技巧最常用于会计系统的设计里,因为会计制度经常需要对很长的数字串作准确的计算。相对于一般的
浮点
式
记数法
,采用BCD码,既可保存数值的精确度,又可免去使计算机作浮点运算时所耗费的时间。此外,对于其他需要高精确度的计算,BCD编码亦很常用。
代码实现:
#include <stdio.h>
#include <stdlib.h>
typedef unsigned char uint8;
typedef unsigned int uint32;
typedef unsigned short WORD;
typedef struct _SYSTEMTIME {
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME;
uint8 HEX2BCD(unsinged char hex_data)
uint8 bcd_data;
uint8 temp;
if (hex_data <= 99)
temp = hex_data % 10;
bcd_data = hex_data / 10 << 4;
bcd_data = bcd_data | temp;
bcd_data = 0xFF;
return bcd_data;
int main() {
SYSTEMTIME gCurrTime;
gCurrTime.wYear = 2024;
gCurrTime.wMonth = 12;
gCurrTime.wDay = 4;
gCurrTime.wHour = 9;
gCurrTime.wMinute = 30;
gCurrTime.wSecond = 59;
printf("BCD: %x %x %x %x %x %x",HEX2BCD((gCurrTime.wYear)/100 ),HEX2BCD((gCurrTime.wYear)%100),HEX2BCD(gCurrTime.wMonth),HEX2BCD(gCurrTime.wDay) ,HEX2BCD(gCurrTime.wHour) ,HEX2BCD(gCurrTime.wMinute) );
return 0;
实测效果:
BCD码也叫二进制编码的十进制数,就是为了方便二进制与十进制的转换而定义的。(如无特殊说明,BCD码指8421BCD码)
1、BCD码每四位表示十进制中的一位的二进制表示;BCD码转换为十进制同理,从右往左每四位按二进制转换为十进制2、因为4位二进制有0到15共16个数,而十进制中只有0到9共10个数,所以BCD码中每四位有6个无效码,即1010到1111。
在进行BCD码加法运算时,如果运算结果处于无效码区间,则需要将运算结果+6(0110)。多位数加法同理,注意,如果出现无效码的地方不是在最后一位,就不
一、BCD码简介
BCD码(Binary-Coded Decimal),用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式,常应用于计算机内部十进制与二进制之间的转换。
BCD码可分为有权码和无权码两类。其中,常见的有权BCD码有8421码、2421码、5421码;无权BCD码有余3码、余3循环码、格雷码。8421码,顾名思义,自高...
在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定的编程能力。如果等保模块学的好,还可以从事等保工程师。薪资区间6k-15k。「8421码」是最基本也是最常用的的一种BCD编码,由4位二进制组成,各位的权值分别是8、4、2、1,8421码的名字也是由此而来。「BCD码」使用 4 位二进制来表示 1 位十进制,即使用 4 个位来存储一个十进制的值,使二进制和十进制之间的转换以快捷的进行。
unsigned int hexresult; //待转化的16进制数;
unsigned char bcdresult[5]; //转化后的bcd码存入数组;
void hex2bcd()
bcdresult[0]=hexresult%10;//个位
bcdresult[0]=(hexresult/10)%10;//十位
bcdresult[0]=(hexresult/10
首先问大家一个问题:计算机是如何把二进制转换成十进制的?
我们平时生活中常用的是十进制,即0 1 2 3 4 5 6 7 8 9,我们使用电脑运算时,会输入十进制的数字,电脑则返回十进制的运算结果。
可实际上,电脑并不能运算十进制,那电脑是怎么运算的呢?
答案是转换为二进制。
当电脑收到我们输入的「十进制」之后,会先把十进制「转换」为二进制,对「二进制」进行运算,再将运算的结果转换为十进制,返回给我们。
BCD码的英文全称是Binary-Coded Decimal,简称BCD,按字面解释是二进制二进制十进制代码,是一种二进制的数字编码形式。通常用4位二进制代码对十进制数字符号进行编码,在这里会主要介绍的几种常用BCD码就是8421码,2421码和余3码。疑问:BCD码是用二进制数对十进制数编码,明明可以直接把十进制数转化为二进制数,为什么非要搞一个四位对一位的BCD码?
BCD码(Binary-Coded Decimal)称为二进码,用4位二进制数来表示1位十进制数中的0~9这10个数码。是十进代码中最常用的一种。在这种编码方式中,每一位二值代码的“1”都代表一个固定数值。将每位“1”所代表的 二进制数加起来就可以得到它所代表的十进制数字。因为代码中从左至右看每一位“1”分别代表数字“8”“4”“2”“1”,故得名8421码。其中每一位 “1”代表的十进制数称为这一位的权。因为每位的权都是固定不变的,所以8421码是恒权码。
在实际应用中需要转换超过255的十六进制数转换为BCD码,如0x123456,但是我找了半天没找到解决问题的方式,找到了也有很多问题,所以自己在理解这些代码后自己写一个。
先来一个我之前找到的一个版本,这个版本的问题在于,超过99后,转换的BCD码就乱了,出现0->99->0->99->0->55->100->199->100->199->100->155->200…以此类推的这样的循环。后面看代码发现这个限制,0...
8421BCD码人性化的存在计算机内毫无例外地都使用二进制数进行运算,但通常采用8进制和十六进制的形式读写。对于计算机技术专业人员,要理解这些数的含义是没问题,但对非专业人员却不那么容易的。由于日常生活中,人们最熟悉的数制是十进制,因此专门规定了一种二进制的十进制码,称为BCD码(Binarycoded Decimal),它是一种以二进制表示的十进制数码。
8421BCD为最常用的一种BCD码
关于这类算法,以前的文章已经讲过类似的:BCD码转二进制#include // HEX转BCD//bcd_data(<0x255,>0)unsigned char BCD2HEX(unsigned int bcd_data){unsigned char temp;temp=((bcd_data>>8)*100)|((bcd_data>>4)*10)|(bcd_d...
/*************************************************************************************************************************
*函数 :
void HextoBCD(u8 *pBuff,u8 len)
*功能 :
十六进制转为BCD码
大家都知道在计算机中,数据的常用编码格式有二进制、八进制、十进制和十六进制等,这些编码格式之间可以相互转换。在电力通信协议中,很多数据都是用BCD格式来编码的,这些数据需要转换为普通的十进制数字串。本文首先对BCD码进行简单的介绍,然后用代码演示它与十进制数字字符串之间的转换。
运用介绍:8421BCD码中的“8421”表示从高到低各位二进制位对应的权值分别为8、4、2、1,将各二进制位与权值相乘,并将乘积相加就得相应的十进制数。例如,8421BCD码“0111”,0×8+1×4+1×2+1×1=7D,其中D表示十进制。bcd_8421模块代码(该代码参考了野火的8421bcd编码)