512y+32m+d怎么理解

GoodNess2010 2013-06-10 11:48:06

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);
}
}


上面代码:
>java DateDemo 12 31 1999
>12/31/1999

------------
这个日期的存取 只用了512y+32m+d这个公式换算的 这个原理是什么呢?
...全文
1036 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
布拉格曼 2016-01-03
  • 打赏
  • 举报
回复
引用 6 楼 dragonzht 的回复:
在C里面就不需要这么复杂了,就是按位存储 bit0~4存储Day bit5~8存储Month bit8~31存储Year
正解
angel6709 2015-10-28
  • 打赏
  • 举报
回复
引用 6 楼 dragonzht 的回复:
在C里面就不需要这么复杂了,就是按位存储 bit0~4存储Day bit5~8存储Month bit8~31存储Year
对的
nihaodadou 2015-09-22
  • 打赏
  • 举报
回复
value=512*y+32*m+d 是假设所有的输入年份都为有效的。 一个int类型的存储长度为32位。 取后1-5位存储d的值,因为 0<1<=d<=31。即2的5次方 取中间6-9位存储m的值,因为 0<1<=m<=12<15。即2的4次方 剩下的10至31位存储y的值(int为有符号整数,32位为符号位)。 这是一个按位存储的算法。
GoodNess2010 2013-06-11
  • 打赏
  • 举报
回复
引用 1 楼 FancyMouse 的回复:
512>365 32>31 取2幂次算起来更快一些。
不好意思 主要的换算关系还是没看懂。 为什么把512换成412就不可以了呢?
dragonzht 2013-06-11
  • 打赏
  • 举报
回复
在C里面就不需要这么复杂了,就是按位存储 bit0~4存储Day bit5~8存储Month bit8~31存储Year
一起来玩玩呗 2013-06-11
  • 打赏
  • 举报
回复
学习了
FancyMouse 2013-06-11
  • 打赏
  • 举报
回复
512>365 32>31 取2幂次算起来更快一些。
FancyMouse 2013-06-11
  • 打赏
  • 举报
回复
哦换412的话day函数也要改……用它这框架的话还需要512是32的倍数。
FancyMouse 2013-06-11
  • 打赏
  • 举报
回复
引用 3 楼 GoodNess2010 的回复:
[quote=引用 1 楼 FancyMouse 的回复:] 512>365 32>31 取2幂次算起来更快一些。
不好意思 主要的换算关系还是没看懂。 为什么把512换成412就不可以了呢?[/quote] 改412的话,year函数要改,month函数也要改。512因为是32的16倍所以它的month能写成那样。要换成412的话month就要换种方法做了。

33,025

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧