java把8位数的日期字符串存进一个长为3的字节数组里面,再转出来也能是存进去时的字符串
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java把8位数的日期字符串存进一个长为3的字节数组里面,再转出来也能是存进去时的字符串相关的知识,希望对你有一定的参考价值。
java把8位数的日期字符串存进一个长为3的字节数组里面,再转出来也能是存进去时的字符串用java代码写,把一个8位数的日期字符串存进一个3位的字节数组。再转化成存进去时的字符串。
大小3的byte数组时24位
日最大是31日,2的5次方最大32,所以 5 位可以表示全部日期
月最大是12月,2的4次方最大16,可以用 4 位表示月份
年份姑且认为最大是9999年,2的14次方可以满足,用14位来表示年份
所以byte数组中,14+4+5 可以表示全部年月日
public static void main(String[] args) throws DocumentExceptionint year = 2018; // 011111100010
int month = 4; // 0100
int day =23; // 00010111
byte[] date = new byte[3];
year = year<<9; //日和月需要9位
month = month<<5;
//存日期
int temp = year | month | day; // 000011111100010 0100 10111
date[2] = (byte) (temp & 0xff); //temp的低8位与1111 1111 与运算,即 10010111 & 11111111
date[1] = (byte) (temp>>8&0xff);//temp的中8位
date[0] = (byte) (temp>>16&0xff);//temp的高8位
//取日期
int dayN = date[2];
dayN = dayN&0x1F; //00011111
//月份需要byte[1]中的低1位与byte[2]中的高3位组合
int monthN = (((date[1] & 1)<<8 | (date[2]&0xE0))&0xffff)>>5;
// 111100000000 | 11000100,年份需要byte[0]与byte[1]的7位拼成,因为月份值只取了byte[1]的低1位,所有只需要右移1位
int yearN = (((date[0]&0xff)<<8 | (date[1]&0xFE))&0xffff)>>1;
System.out.println(yearN+"年"+monthN+"月"+dayN+"日");
参考技术A java.util.Date 方法getTime返回是long,,,,虽然不是3字节,但可以用3字节保存
转回来,看Date的构造
~~~~~~~~~~~~~追问
代码呢,大佬
参考技术B 哥们儿,这应该是面试时的机试题吧!java的数据类型
基本概念
bit(位)
位是计算机中存储数据的最小单位,指二进制数中的一个位数,其值为“0”或“1”。
byte(字节)
字节是计算机存储容量的基本单位,一个字节由8位二进制数组成。在计算机内部,一个字节可以表示一个数据或者一个英文字母,但是一个汉字需要两个字节表示。
换算
1Byte=8bit
1KB=1024Byte(字节)=8*1024bit
1MB=1024KB
1GB=1024MB
1TB=1024GB
java数据类型
基本数据类型
boolean 只有两个值:true、false,可以使用 1 bit 来存储,但是具体大小没有明确规定。JVM 会在编译时期将 boolean 类型的数据转换为 int,使用 1 来表示 true,0 表示 false。
JVM 支持 boolean 数组,但是是通过读写 byte 数组来实现的。
包装类型
基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。
缓存池
new Integer(123) 与 Integer.valueOf(123) 的区别在于:
- new Integer(123) 每次都会新建一个对象。
- Integer.valueOf(123) 会使用缓存池中的对象,多次调用会取得同一个对象的引用。
valueOf() 方法的实现比较简单,就是先判断值是否在缓存池中,如果在的话就直接返回缓存池的内容。
在 Java 8 中,Integer 缓存池的大小默认为 -128~127。
编译器会在自动装箱过程调用 valueOf() 方法,因此多个值相同且值在缓存池范围内的 Integer 实例使用自动装箱来创建,那么就会引用相同的对象。
基本类型的对应的缓冲池:
- boolean values true and false
- all byte values
- short values between -128 and 127
- int values between -128 and 127
- char in the range \\u0000 to \\u007F
在使用这些基本类型对应的包装类型时,如果该数值范围在缓冲池范围内,就可以直接使用缓冲池中的对象。
Byte、Short、Integer、Long、Char这几个装箱类的valueOf()方法都会做缓存,而Float、Double则不会,原因也很简单,因为byte、Short、integer、long、char在某个范围内的整数个数是有限的,但是float、double这两个浮点数却不是。
在 jdk 1.8 所有的数值类缓冲池中,Integer 的缓冲池 IntegerCache 很特殊,这个缓冲池的下界是 - 128,上界默认是 127,但是这个上界是可调的,在启动 jvm 的时候,通过 -XX:AutoBoxCacheMax=<size> 来指定这个缓冲池的大小,该选项在 JVM 初始化的时候会设定一个名为 java.lang.IntegerCache.high 系统属性,然后 IntegerCache 初始化的时候就会读取该系统属性来决定上界。
以上是关于java把8位数的日期字符串存进一个长为3的字节数组里面,再转出来也能是存进去时的字符串的主要内容,如果未能解决你的问题,请参考以下文章