注意:原始问题已被编辑,不再需要月份。原始计算如下:
这只是您想要进行多少计算的问题。最紧凑的打包方法是,如果您可以创建自己的类型,并使用以下数学来转换对应的整数:
有效范围是:
月份:1-12 -> (0-11)+1
日:1-31 -> (0-30)+1
小时:0-24
分钟:0-60
您可以选择存储值的顺序(我将按上述顺序保留)。
月-1 天-1 小时分钟
(0-11) (0-30) (0-23) (0-59)
使用以下公式作为指导,进行一些乘法/除法以转换值:
值 = (((月 - 1) * 31 + (日 - 1)) * 24 + 小时) * 60 + 分钟
因此,您有最小值 0 和最大值 ((11*31+30)*24+23)*60+59,即 535,679。因此,您至少需要 20 位才能将此值存储为无符号整数 (2^20-1 = 1,048,575; 2^19-1 = 524,287)。
如果你想让事情变得复杂但节省一个字节,你可以使用 3 个字节并自己操作它们。或者您可以使用 int(32 位)并使用简单的数学运算符正常使用它。
但是那里有一些空间可以玩,所以让我们看看我们是否可以让这更容易:
有效范围是:
月份:1-12 -> (0-11)+1 --- 4 位(你甚至不需要 -1)
日:1-31 -> (0-30)+1 --- 5 位(您再次不需要 -1)
小时:0-24 --- 5 位
分钟:0-60 --- 6 位
总共有 20 位,而且非常容易操作。因此,除了使用简单的位移之外,进一步压缩不会获得任何收益,并且可以像这样存储值:
19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
---月--- ----日------- ---小时--- --分钟---
如果你不关心月份,你能得到的最紧的是:
值 = ((Day - 1) * 24 + Hour) * 60 + Minute
为您提供 0 到 44,639 的范围,可以整齐地放入 16 位 short。
不过那里有一些空间可以玩,所以让我们看看我们是否可以让这变得更容易:
有效范围是:
Day: 1-31 -> (0-30)+1 --- 5 位(你甚至不需要 -1)
小时:0-24 --- 5 位
分钟:0-60 --- 6 位
总共有 16 位,而且非常容易操作。所以....像这样存储值:
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
----天------- ---小时--- --分钟---