算法书中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次运算,花费的时间就相对要多一点。是否使用这种方式,则需要根据项目需求来进行考量。