我想在C中创建自己的时间戳数据结构.
DAY(0 - 31),HOUR(0 - 23),MINUTE(0 - 59)
可能的最小数据结构是什么?
好吧,你可以将它全部打包成一个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
.]
你的意思是0-23和分钟0-59?我听说过闰秒但不是闰秒或小时.
(log (* 31 60 24) 2) => 15.446
因此,您可以将这些值拟合为16位或2个字节.这是一个好主意是一个完全不同的问题.
月份:范围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;
但你真的需要这个吗?标准时间功能不足够吗?位域根据架构,填充等而有所不同......不是便携式构造.