对日期数据类型巧妙封装 y*512+m*32+d的简单理解。

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的值,也就是取模的结果了。

发布了20 篇原创文章 · 获赞 17 · 访问量 1797

猜你喜欢

转载自blog.csdn.net/qq_42534991/article/details/103993669