C语言十进制与BCD码互换详解及算法实现

小满
小满
发布时间:2026-10-16 | 4人浏览过
原创

在嵌入式开发中,尤其是配置单片机 RTC(实时时钟)的日期和时间时,通常需要使用 BCD 码进行存储和处理。由于硬件寄存器往往直接支持 BCD 格式,而在应用层我们习惯使用十进制,因此需要在两者之间进行高效的转换。本文将深入解析这两种编码的转换原理,并提供适用于 C 语言的两种典型实现方案。

理解 BCD 码基础

BCD 码(Binary Coded Decimal)是用二进制数来表示十进制数的编码方式。其基本规则是:使用 4 位二进制数来表示一位十进制数(0-9)。因此,4 位二进制数最大只能表示十进制的 9(即 1001)。

由于单个字节只有 8 位,它可以容纳两位十进制数(例如 0x99 表示十进制 99)。但在实际加法运算中,BCD 码遵循“逢九进一”的规则,这与十六进制(Hex,逢十六进一)不同。这种进位差异是转换算法设计的核心依据。

第1步:掌握转换核心原理

十进制转 BCD 码的逻辑:
十进制是逢十进一,而十六进制是逢十六进一。每满十,十六进制会多进一位。因此,每发生一次十进制进位,实际上比十六进制多进了 16 - 10 = 6 位。简单来说,十进制数转 BCD 码,可以看作是在原数值基础上加上其“进位次数 × 6”。

BCD 码相加修正规则:
当两个 BCD 码相加时:
1. 如果结果 ≤ 9(即十六进制 0x09),无需修正。
2. 如果结果在 10~15 之间(即十六进制 0x0A ~ 0x0F),需要加 6 进行修正,并产生进位。

算法实现方案

第2步:复杂版实现(按位处理法)

这种方法直观地模拟了数字的位操作,适用于理解数据结构的转换逻辑。它通过循环取出每一位进行处理。

十进制转换为 BCD 码:

int decimal_bcd_code(int decimal)
{
	int sum = 0;  // sum 返回的 BCD 码
 
	for (int i = 0; decimal > 0; i++)
	{
		// 提取十进制的最后一位,左移 4*i 位放到对应位置
		sum |= ((decimal % 10 ) << ( 4*i));
 
		decimal /= 10;  // 去掉已处理的最低位
	}
 
	return sum;
}

BCD 码转换为十进制:

int bcd_decimal_code( int bcd)
{
	int sum = 0, c = 1;  // sum 返回十进制,c 用于累乘权值
 
	for(int i = 1; bcd > 0; i++)
	{
		if( i >= 2)
		{
			c*=10;  // 计算当前位置的权重(1, 10, 100...)
		}
 
		// 提取 BCD 的一位(低4位),乘以权重累加
		sum += (bcd%16) * c;
 
		bcd /= 16;  // 右移一个 BCD 位,处理下一位
	}
 
	return sum;
}

第3步:简易版实现(数学运算法)

利用前文提到的“进位差为 6”的特性,可以通过加减法实现更紧凑的代码。这种方法在简单的单字节操作中效率较高。

十进制转换为 BCD 码:

int decimal_to_bcd(int decimal)
{
    // 原数 + (原数 / 10) * 6
    // 解释:十进制除以10得到进位数,每个进位相当于多了6个单位的十六进制增量
    return (decimal + (decimal/10) * 6);
}

BCD 码转换为十进制:

int bcd_to_decimal(int bcd)
{
    // 原数 - (原数 >> 4) * 6
    // 解释:右移4位相当于取高位的 BCD 值,减去之前多加的进位偏差
    return (bcd - (bcd>>4) * 6);
}

示例验证

以十进制数 99 为例,验证简易版算法:

  1. 十进制转 BCD:
    - 计算:99 + (99/10) * 6 = 99 + 9 * 6 = 99 + 54 = 153
    - 153 的十六进制正是 0x99,符合预期。
  2. BCD 转十进制:
    - 输入 BCD 0x99(即十进制 153)
    - 计算:153 - (153 >> 4) * 6
    - 153 >> 4 结果为 9
    - 最终结果:153 - 9 * 6 = 153 - 54 = 99,恢复原始十进制。

总结

以上即为 C 语言中十进制与 BCD 码互换的详细方法与代码实现。对于简单的两位数处理,数学运算法(简易版)更加简洁高效;而对于需要扩展或多字节处理的场景,按位处理法(复杂版)逻辑更为清晰稳定。以上就是C语言十进制与BCD码互换详解与算法实现的详细内容,更多关于嵌入式开发与RTC配置的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表