本文框架
- 前言
- 1. BCD码是什么?
- 2. 不同进制与BCD码之间的转换
- 2.1 十进制与BCD码的转换
- 2.1.1 十进制转换为BCD码
- 2.1.2 BCD码转换为十进制
- 2.2 十六进制与BCD码的转换
前言
在诊断快照开发中会遇到保存年月日等使用BCD码格式的需求,本篇我们就一起看一下BCD码是什么?十进制与BCD码如何互换?十六进制与BCD码如何互换?在这里会直接封装成可以使用的接口供大家直接在项目中调用,方便你我他。
1. BCD码是什么?
BCD码(Binary-Coded Decimal),用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式,用二进制编码的十进制代码。BCD码使用四个位Bit来储存一个十进制的数码,使二进制和十进制之间的转换得以快捷的进行。
举个栗子,对于十进制的19,对应BCD码格式就是0001 1001,即前四个Bit合起来为1,后一个Bit合起来为9,这样的表达形式对于日期,时间等表达上较为直观。
另外,对于BCD码也可细分成下面的8421码,5421码,2421码及余3码等,8421码,5421码,2421码为有权BCD码,但加权方式不一样,比如对于8421码,四个Bit对应的值分别为8,4,2,1。8421BCD码也是使用较多的BCD编码格式,下面我们讲到的格式互换也是以8421BCD码进行,后续提到的BCD码默认是8421BCD码。
2. 不同进制与BCD码之间的转换
本章节我们会说明不同进制与BCD码之间的转换,计算方法+接口封装,从学到用相结合。
2.1 十进制与BCD码的转换
在十进制转换到BCD码时,核心思想即是将个位数放在低四Bit,十位数放在顺序往前的四Bit,如果有百位,千位以此类推,涉及到位移操作。
2.1.1 十进制转换为BCD码
int Func_DecToBcd(int decimal)
{
int sum = 0; //sum为BCD码
for (int i = 0; decimal > 0; i++)
{
sum |= ((decimal % 10 ) << ( 4*i));
decimal /= 10;
}
return sum;
}
2.1.2 BCD码转换为十进制
int Func_BcdToDec( int bcd)
{
int sum = 0; // sum为十进制
int c = 1; //c乘法因子,每次翻10倍
for(int i = 1; bcd > 0; i++)
{
if( i >= 2)
{
c*=10;
}
sum += (bcd%16) * c;
bcd /= 16; // 右移四位
}
2.2 十六进制与BCD码的转换
注意这里的0x15,在本示例代码中需要先将其转换成十进制,即对应十进制21,再转换为BCD码,代码待进一步完善。
最后附一张换算图: