中易网

java把8位数的日期字符串存进一个长为3的字节数组里面,再转出来也能是存进去时的字符串

答案:3  悬赏:0  
解决时间 2021-01-12 20:59
  • 提问者网友:鐵馬踏冰河
  • 2021-01-12 12:05
java把8位数的日期字符串存进一个长为3的字节数组里面,再转出来也能是存进去时的字符串
最佳答案
  • 二级知识专家网友:酒醒三更
  • 2021-01-12 12:13
大小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+"日");


}
全部回答
  • 1楼网友:酒安江南
  • 2021-01-12 12:49
java.util.Date 方法getTime返回是long,,,,虽然不是3字节,但可以用3字节保存
转回来,看Date的构造
~~~~~~~~~~~~~追问代码呢,大佬
  • 2楼网友:轮獄道
  • 2021-01-12 12:37
哥们儿,这应该是面试时的机试题吧!
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息!
大家都在看
推荐信息