算法:只使用一个int类型变量表示日期

1 篇文章 0 订阅

算法书中1.2.4节中有这样一段代码,用y*512+m*32+d来表示日期。

public class Date{
    private final int value;
    public Date(int y,int m,int d){
        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();
    }
}

这里使用到了按位存储的思路。value=y*512+m*32+d。512为2^9,  32为2^5

day:最大31,小于2^5,用1-5位存储,在上面算式中不做位移调整

month:最大12,小于2^4,用6-9位存储。m*32即表示左移5位

year:剩余10位及之后的表示年份。y*512即表示左移9位。

用个实际日期举例,比如2022/9/18,根据y*512+m*32+d计算得出为1,035,570

转换为二进制后,为1111 1100 1101 0011 0010

最后再来说说分别怎么计算的年月日。

day=value % 32  即二进制数字取最后5位1 0010,转换为10进制就是2^4+2^1=18

month=(value / 32) % 16 ,首先是/32,即右移5位,变成1111 1100 1101 001,然后%16,即取最后4位1 001,2^3+2^0=9

year=value / 512,即右移9位,取得111 1110 0110,2^10+2^9+2^8+2^7+2^6+2^5+2^2+2^1=2022

使用这种方式进行数据保存,所需的空间较少,但是取得所需的年月日的时候,因为需要进行1,2次运算,花费的时间就相对要多一点。是否使用这种方式,则需要根据项目需求来进行考量。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值