我在“算法第4版”一书中找到了这个存储日期的例子,只使用了一个整数。我不确定它是否正确。
这是日期的类定义。
public class Date
{
private final int value;
public Date(int m, int d, int y)
{ value = y*512 + m*32 + d; }
public int month()
{ return (value / 32) % 16; }
public int day()
{ return value % 32; }
public int year()
{ return value / 512; }
public String toString()
{ return month() + "/" + day()
}
数字512和32来自何处,为什么我们在计算月份时以16为模数。
答案 0 :(得分:1)
是的,如果您的整数有32位,那么您可以在其中存储从01-01-0001到(或多或少)01-01-8388608的所有有效日期,其中8388608是一年。 此外,整数值的顺序与日期的自然顺序相同。
但它是如何完成的?
首先观察到月中所有可能的天数都适合区间[0,31](注意永远不会使用0)。 因此,您只需使用五位即可存储它。
同样,所有可能的月份都适合区间[0,15],所以现在只需要4位。
整个日期保存如下:
...011111100001 <---------- year
||||||||||||1100 <------ month
||||||||||||||||10011 <- day
------------------------
011111100001110010011
如果你想得到年份的价值,你必须摆脱最初的9位。您可以通过简单地将值除以2来删除一位。要删除9位,您必须将9次除以2,或者 - 一步 - 除以2 ^ 9 = 512。
在上面的示例中,当您将011111100001110010011除以2 ^ 9:
时011111100001110010011
1000000000 = 2^9
---------------------
011111100001
你得到011111100001(或十进制2017)。
简而言之: