public class DateDemo {
private final int value;
public DateDemo(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() + "/" + year();
}
public static void main(String[] args) {
int m = Integer.parseInt(args[0]);
int d = Integer.parseInt(args[1]);
int y = Integer.parseInt(args[2]);
Date date = new Date(m, d, y);
StdOut.println(date);
}
}
如果 输入 y=1 m = 1 d = 1;
value = y * 512 + m * 32 + d; ->545
return (value / 32) % 16; ->545/32=17 17%16 ->1 故m=1
return value % 32; d=1;
return value / 512; y=1;
底层分析。数据结构 二进制的运用
假设所有的输入年份都为有效的。
一个int类型的存储长度为32位
因为每个月最多31天 故 1<=d<32 2的0次方 <=d < 2的5次方
同理每年12个月 故 1<=m<=12 2的0次方<=m < 2的4次方
年数不限,
那么 是不是可以理解
0-5 6-9 10-31
d m y
这样的存储结构。
因为m乘32即左移5位,y乘512即左移9位
至于月份计算value右移5位,现在32bit中只有y和m的值了,再右移4位,只剩下y的值了,移出去的就是m的值,也就是取模的结果了。