网站首页 > java教程 正文
一个有趣的面试题,如何用3个字节存储年月日呢?我们都知道一个字节存储数据最大是255,年份超过255,需要2个字节,月份和天数只需要一个字节就够了,但是我们发现这样存储的话,就需要4个字节了,那么用3个字节到底怎么处理呢?
我们思考一下,1个字节是8位,3个字节就是24位。一个月最多31天,只需要5位就够了,12个月份也只用占4位,还剩下15位用来存储年份,最大能表示3万多年,是足够的,所以理论上是可以用3个字节来存储年月日。代码应该怎么实现呢,我们将上面的思路用一个表格来表示
位数 | 年(15) | 月(4) | 日(5) |
标准字节 | 11111111 | 11111111 | 11111111 |
拆分字节 | 111111111111111 | 1111 | 11111 |
最大数值 | 32767 | 15 | 31 |
由上表可知,我们可以存储的最大年份是32767年,月份是15,天数是31,完全符合我们的实际需求。以下用java代码来实现
public class Demo {
/**
* 将传入的年月日存储在3个字节的数组中
* 3个字节总共24位,从左到右前15位存年份,中间4位存月份,最后5位存储天数
* @param year 年份
* @param month 月份
* @param day 天数
* @return 返回存储字节数组
*/
private static byte[] date2bytes(int year, int month, int day) {
byte[] bytes = new byte[3];
bytes[2] = (byte) (((0x7 & month) << 5) | (0x1F & day));
bytes[1] = (byte) (((0x7F & year) << 1) | ((0x8 & month) >> 3));
bytes[0] = (byte) ((0x7F80 & year) >> 7);
return bytes;
}
/**
* 从存储年月日的3个字节中解析出年月日数据
* @param bytes 待解析的字节数组
* @return 返回长度为3的数组,依次表示年,月和日
*/
private static int[] bytes2date(byte[] bytes) {
int[] date = new int[3];
date[2] = bytes[2] & 0x1F;
date[1] = ((bytes[1] & 0x1) << 3) | ((bytes[2] & 0xE0) >> 5);
date[0] = ((bytes[0] & 0xFF) << 7) | ((bytes[1] & 0xFE) >> 1);
return date;
}
}
我们以2021年12月31日来测试一下最终的效果
我们可以看到存储的三个字节中的值,最后解析3个字节也还原成了最初我们设置的日期。
猜你喜欢
- 2024-12-25 我的世界21w37a:1.18首发快照,生存难度升级!刷怪笼将无视亮度
- 2024-12-25 深入理解Mysql数据存储 mysql数据存储结构是什么
- 2024-12-25 如何用控制台打印日历? 如何用控制台打印日历内容
- 2024-12-25 甲骨文7月安全更新:修复113个Java等漏洞
- 2024-12-25 Java语法入门004 java编程语法
- 2024-12-25 100个Java工具类之53:日历类Calendar
- 2024-12-25 Java 阴历阳历转换 java 日期转换 yyyy-mm-dd
- 2024-12-25 Java 操作之RestHighLevelClient查询详解
- 2024-12-25 Oracle公布Java9未来进度表 oracle java doc
- 2024-12-25 java.util.Date、java.sql.Date、java.sql.Timestamp区别和总结
你 发表评论:
欢迎- 04-26Java高效处理大文件读写的全方位指南
- 04-26省钱兄JAVA视频交系统开发
- 04-26Java常用工具类技术文档
- 04-26高效使用Java构建工具,Maven篇|云效工程师指北
- 04-26Java中自定义配置文件可以如此简单
- 04-26Java 技术文档(详细版)
- 04-26DuckDuckGo应用和扩展全面禁止谷歌的单点登录弹窗
- 04-26单点登录的终级解决方案-xxlSso
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)