![]() |
1
32
你在找位域。 它们看起来像这样:
根据编译器的不同,为了在没有填充的情况下放入四个字节,成员的大小必须为四个字节(即。
下面是一个MSDN链接,它深入到了位字段: |
![]() |
2
15
一般来说,位字段是一种“正确”的方式,但为什么不直接存储年初以来的秒数呢?4个字节足以轻松存储这些数据;事实上,4个字节足以存储1970年到2038年间的秒数。从中获取其他信息是一个简单的练习,只要你知道当前年份(只要你感兴趣的时间范围不超过70年,你可以将其与其他信息一起存储(即使这样,你也可以将时间戳分为68年范围,并为每个范围存储一个偏移量)。 |
![]() |
3
13
另一种解决方案是将值存储在一个32位变量中,并通过位移位检索单个项。
|
![]() |
4
2
如果你能处理两秒的精度,MS-DOS时间戳格式使用16位来保存日期(1980年为7位,月为4位,日为5位)和16位来保存时间(小时为5位,分钟为6位,秒为5位)。在Arduino这样的处理器上,可能可以编写跨越16位边界分割值的代码,但我认为如果可以避免这种分割(就像MS-DOS接受两秒精度所做的那样),代码将更加高效。 否则,正如在另一个答案中所指出的,使用32位的秒数,因为一些基本时间通常比试图以“日历格式”跟踪事情更有效。如果你需要做的只是从一个日历格式的日期提前到下一个日历格式的日期,那么这样做的代码可能比在日历日期和线性日期之间转换的代码要简单,但是如果你需要做很多其他事情(甚至从一个日期向后退一步到前一个日期),那么在输入或显示日期时,最好将日期转换为线性格式,否则,只需处理线性秒数。 如果你选择闰年的3月1日作为基准日期,那么使用线性秒数会更方便。然后,当日期超过1461时,将其从日期中减去,并在年份中加上4(16位比较和减法在Arduino上是有效的,即使在2040年,循环所需的时间也可能比单个16x16除法要短)。如果日期超过364,则减去365并增加年份,最多再尝试两次(如果第三次减去后的日期是365,则保留该日期)。 需要注意确保所有角盒都能正常工作,但即使是在8位或16位微芯片上,转换也会出人意料地高效。 |
![]() |
rookie · 检查函数模板的所有参数包参数是否属于int 1 年前 |
![]() |
ivaigult · -W转换和隐式字符串到布尔类型转换 1 年前 |
![]() |
rainer · 后台插入程序的初始化 1 年前 |
![]() |
Community wiki · 以理智、安全和高效的方式复制文件 1 年前 |
|
Shefali Kanaujia · 对C中向量的向量进行排序++ 1 年前 |
|
Ma Joonyoung · 粗粒度和细粒度链表的时间比较 1 年前 |