Arduino 理解Adruino二进制到十进制对话

Arduino 理解Adruino二进制到十进制对话,arduino,type-conversion,Arduino,Type Conversion,今天,我在看一些将实时时钟与arduino集成在一起的代码,其中有些二进制到十进制(反之亦然),我不完全理解 有关守则如下: byte decToBcd(byte val) { return ( (val/10*16) + (val%10) ); } byte bcdToDec(byte val) { return ( (val/16*10) + (val%16) ); } ex: decToBcd(12); 我真的不明白这是怎么回事。我不确定我是否理解数学,或者是否有人利用了某种

今天,我在看一些将实时时钟与arduino集成在一起的代码,其中有些二进制到十进制(反之亦然),我不完全理解

有关守则如下:

byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}

byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}

ex: decToBcd(12);
我真的不明白这是怎么回事。我不确定我是否理解数学,或者是否有人利用了某种假设

有人能解释一下下面的数学和数据类型是如何工作的吗?如果可能的话,请谈谈当我们使用字节值时,为什么在转换中使用值“16”而不是“8”


对于上下文,可以在这里找到完整的代码:

这里的关键提示是BCD--在函数名中。在BCD中,每个十进制数字由四位(半字节)表示。因此,使用BCD表示法可以存储的最大(十进制)数字在上半字节(字节的一半)为99-9,在下半字节为9。 让我们看一看数字12作为一个例子。数字12的二进制表示法如下所示:

12 = %00001010
然而,在BCD中,它如下所示:

12 = %00010010 
因为

0001 0010
   1    2
现在,如果您查看
decToBcd
函数
val%10
,它负责计算一位的值(即最后一位数字)。因为这是字节的下半部分,所以这里不需要做任何特殊的事情
val/10*16
首先计算十位的值-
val/10
。但是,由于该值必须移到字节的上半部分,因此需要将其上移四位-因此
*16
。编写此函数的另一种方法(我认为更具可读性)是:

((val / 10) << 4) | (val % 10)

((val/10)RTC通常将年份存储在1字节中,仅为2位数字,即:2014为14。
其中一些将其存储为1970年的数字,因此2014年=44。

因此,在这两种情况下,它所能容纳的最大值都是99。

谢谢,这对我来说很有意义!尽管我想知道,基于这段代码,如果你只能从0-99中获取数字,有人会如何从RTC中提取年份?2014年会以两个二进制编码的小数返回吗?我不看代码,所以我不知道他们是如何使用这些函数的。我认为它们是ave将年份存储为短(16位)变量,然后您可以通过两次调用该方法将其转换为两个bcd字节—一次是百年(year/100),一次是百年(year%100)