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

本文深入探讨了一种日期数据结构的实现方式,通过将年、月、日转换为整数值并进行位运算,实现了日期的高效存储与快速解析。文章详细解释了数据结构的设计原理,包括如何利用二进制位移和取模操作来提取日期的各部分信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值