这是存储日期的正确方法吗?

时间:2017-12-19 11:30:08

标签: date

我在“算法第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为模数。

1 个答案:

答案 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)。

简而言之:

  • 除以2 ^ n ==删除数字的最后n位,将所有内容移到右边。
  • dividion modulo 2 ^ n ==仅查看最后n位。