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

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

目录

1、复杂版


2、简易版


最近写单片机 RTC 日期、时间配置,需要实现十进制、BCD码互换,将示例Demo分享给各位朋友:


image.png


BCD是指用二进制来表示十进制数的编码,即:用4位二进制来表示一位十进制数,因此4位二进制数表示最大的十进制数9(1001)。


一个四位的BCD码不能够表达十进制的两位数,因此当数字大于九时,我们需要用八位BCD码来表示。高位只需要逢九进一即可。


十进制是逢十进一,而十六进制是逢十六进一,它们之间的每次进位差6,所以一个十进制数要转换成BCD码,要先算清多进位的位数。


当两个BCD码相加,如果和等于或小于 1001(即十进制数9),不需要修正。


image.png


如果相加之和在 1010 到1111(即十六进制数 0AH~0FH)之间,则需加 6 进行修正。


image.png


例如,十进制99进位了99/10=9次,每次进位和十六进制进位相比差6,所以一共差了9×6=54,即BCD码为:99+54=153(十六进制:0X99)。BCD码转化成十进制码也一样原理。


1、复杂版

十进制转换为BCD码,代码如下所示:


int decimal_bcd_code(int decimal)
{
  int sum = 0;  //sum返回的BCD码
  for (int i = 0; decimal > 0; i++)
  {
  sum |= ((decimal % 10 ) << ( 4*i));
  decimal /= 10;
  }
  return sum;
}

BCD码转换为十进制,代码如下所示:


int bcd_decimal_code( int bcd)
{
  int sum = 0, c = 1;  // sum返回十进制,c每次翻10倍
  for(int i = 1; bcd > 0; i++)
  {
  if( i >= 2)
  {
    c*=10;
  }
  sum += (bcd%16) * c;
  bcd /= 16;  // 除以16同理与十进制除10将小数点左移一次,取余16也同理
  }
  return sum;
}

2、简易版

十进制转换为BCD码,代码如下所示:


int bcd_decimal_code( int bcd)
{
    return (bcd + (bcd/10) * 6);
}
BCD码转换为十进制,代码如下所示:
int decimal_bcd_code(int decimal)
{
    return (decimal - (decimal>>4) * 6);
}
相关文章
|
2月前
|
存储 C语言
C语言实现二进制到十进制
C语言实现二进制到十进制
13 0
|
4月前
|
C语言
c语言点分十进制IP转整型
c语言点分十进制IP转整型
|
4月前
|
存储 C语言
C语言实现十进制转化为十六进制-------数组,switch语句,while循环语句
C语言实现十进制转化为十六进制-------数组,switch语句,while循环语句
|
7月前
|
C语言
C语言之将十进制整数转换为任意进制整数
C语言之将十进制整数转换为任意进制整数
158 0
|
7月前
|
C语言
C语言之十进制转化为十六进制
C语言之十进制转化为十六进制
|
7月前
|
存储 C语言 C++
C语言之数据的存储2(浮点数在内存中如何存储,如何输出,查看不同类型数据在内存中表示的范围的方法,十进制浮点数转化为二进制的方法)
C语言之数据的存储2(浮点数在内存中如何存储,如何输出,查看不同类型数据在内存中表示的范围的方法,十进制浮点数转化为二进制的方法)
|
2月前
|
存储 C语言
十进制转二进制,C语言的必备技能
十进制转二进制,C语言的必备技能
|
2月前
|
存储 C语言
C语言十进制转二进制
C语言十进制转二进制
29 0
|
5月前
|
人工智能 C语言
c语言编程练习题:7-15 BCD解密
BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了
33 0
|
5月前
|
C语言
C 语言实例 - 八进制与十进制相互转换
C 语言实例 - 八进制与十进制相互转换
30 2