当前位置:  开发笔记 > 编程语言 > 正文

可以存储时间戳的最小字节数是多少?

如何解决《可以存储时间戳的最小字节数是多少?》经验,为你挑选了3个好方法。

我想在C中创建自己的时间戳数据结构.

DAY(0 - 31),HOUR(0 - 23),MINUTE(0 - 59)

可能的最小数据结构是什么?



1> Daniel LeChe..:

好吧,你可以将它全部打包成一个unsigned short(那是2个字节,5个位表示Day,5位表示小时,6位表示分钟)...并使用一些移位和屏蔽来获取值.

unsigned short timestamp = ; // Bits: DDDDDHHHHHMMMMMM

int day = (timestamp >> 11) & 0x1F;
int hour = (timestamp >> 6) & 0x1F;
int min = (timestamp) & 0x3F;

unsigned short dup_timestamp = (short)((day << 11) | (hour << 6) | min); 

或使用宏

#define DAY(x)    (((x) >> 11) & 0x1F)
#define HOUR(x)   (((x) >> 6)  & 0x1F)
#define MINUTE(x) ((x)         & 0x3F)
#define TIMESTAMP(d, h, m) ((((d) & 0x1F) << 11) | (((h) & 0x1F) << 6) | ((m) & 0x3F)

(你在当前版本的问题中没有提到月/年,所以我省略了它们).

[ 编辑:使用unsigned short- 未签名short.]


@ mpez0:只有你喜欢缓慢,臃肿的代码.

2> Ken..:

你的意思是0-23和分钟0-59?我听说过闰秒但不是闰秒或小时.

(log (* 31 60 24) 2)
=> 15.446

因此,您可以将这些值拟合为16位或2个字节.这是一个好主意是一个完全不同的问题.



3> dirkgently..:

月份:范围1 - 12 => 4位

日期:范围1 - 31 => 5位

小时:范围0 - 24 => 5位

分钟:范围0 - 60 => 6位


总计:20位

您可以使用位域并使用编译器/平台特定的pragma来保持紧密:

typedef struct packed_time_t {
    unsigned int month  : 4;
    unsigned int date   : 5;
    unsigned int hour   : 5;
    unsigned int minute : 6;
} packed_time_t; 

但你真的需要这个吗?标准时间功能不足够吗?位域根据架构,填充等而有所不同......不是便携式构造.

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有