BCD转十进制和十进制转BCD
BCD to Decimal And Decimal to BCD
我正在为存储数据的 Arduino 中的 RTC 模块 编写一个 库 在 BCD 中。我知道如何将十进制数转换为 BCD,但在以编程方式编写时遇到一些问题。在网上搜索后,我得到了两个公式,如下所示,并且可以完美地工作,但无法理解它是如何计算的。
1.公式1
DEC 转 BCD
(value / 10 * 16) + (value % 10)
例子
DEC -> 40 在 BCD 中转换为 01000000 再次等于64.
因此,如果我输入公式,我会得到相同的结果。
(40/10 * 16) + (40%10)
= (4*16) + 0
= 64
BCD 转 DEC
(value / 16 * 10) + (value % 16)
2。公式2
DEC 转 BCD
val + 6 * (val / 10)
BCD 转 DEC
val - 6 * (val >> 4)
如果有人能详细解释一下会很有帮助。
在此先感谢大家。
正确的转换函数是:
byte bcdToDec(byte val)
{
return( (val/16*10) + (val%16) );
}
byte decToBcd(byte val)
{
return( (val/10*16) + (val%10) );
}
为什么这行得通?让我们取一个数字5。在二进制中,它是
0101 = 5
现在让我们将同一个数字向左移动四位,方法是向右添加四个零:
0101 0000 = 50 BCD
这就是 BCD 的工作原理。由于需要四个二进制数字来表示十进制数字 0 到 9,因此每个十进制数字由四位表示。关键是 二进制移动四位乘以或除以 16,所以这就是公式中 16
值的原因。
所以我们取 96:
0110 = 6
1001 = 9
1001 0110 = 96 BCD
我正在为存储数据的 Arduino 中的 RTC 模块 编写一个 库 在 BCD 中。我知道如何将十进制数转换为 BCD,但在以编程方式编写时遇到一些问题。在网上搜索后,我得到了两个公式,如下所示,并且可以完美地工作,但无法理解它是如何计算的。
1.公式1
DEC 转 BCD
(value / 10 * 16) + (value % 10)
例子
DEC -> 40 在 BCD 中转换为 01000000 再次等于64.
因此,如果我输入公式,我会得到相同的结果。
(40/10 * 16) + (40%10)
= (4*16) + 0
= 64
BCD 转 DEC
(value / 16 * 10) + (value % 16)
2。公式2
DEC 转 BCD
val + 6 * (val / 10)
BCD 转 DEC
val - 6 * (val >> 4)
如果有人能详细解释一下会很有帮助。
在此先感谢大家。
正确的转换函数是:
byte bcdToDec(byte val)
{
return( (val/16*10) + (val%16) );
}
byte decToBcd(byte val)
{
return( (val/10*16) + (val%10) );
}
为什么这行得通?让我们取一个数字5。在二进制中,它是
0101 = 5
现在让我们将同一个数字向左移动四位,方法是向右添加四个零:
0101 0000 = 50 BCD
这就是 BCD 的工作原理。由于需要四个二进制数字来表示十进制数字 0 到 9,因此每个十进制数字由四位表示。关键是 二进制移动四位乘以或除以 16,所以这就是公式中 16
值的原因。
所以我们取 96:
0110 = 6
1001 = 9
1001 0110 = 96 BCD