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 DocumentException 
    int 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的字节数组里面,再转出来也能是存进去时的字符串的主要内容,如果未能解决你的问题,请参考以下文章

进制,字节,字长,位数

一个字节等于多少二进制数?

字字节关系

我们通常说的中央处理器64位是啥意思

字与字节的区别(详细)

mysql数据类型