当前位置: 首页 > 科技观察

一道有趣的面试题:如何用三个字节来存储年月日

时间:2023-03-12 11:43:04 科技观察

一道有趣的面试题,如何用三个字节来存储年月日?我们都知道一个字节最多可以存储255个数据,年份超过255个就需要2个字节,月数和天数只需要一个字节就够了,但是我们发现如果存储在这个way,它需要4个字节,那么3个字节怎么处理呢?大家想一想,1个字节是8位,3个字节是24位。一个月最多31天,5位就够了,12个月只需要4位,剩下15位用来存年份,最多可以代表3万多年,足够了,所以在理论上是可以用3个字节存储年月日。代码应该如何实现?我们将使用一个表格来表示上述想法。从上表可以看出,我们最大可以存储的年份是32767,月份是15,天数是31,完全可以满足我们的实际需求。下面是用java代码实现的。publicclassDemo{/***将传入的年月日存储在一个3字节*3字节共24位的数组中,前15位从左到右存储年份,中间4位存储月份,最后5位存储天数*@paramyearyear*@parammonthmonth*@paramdayDays*@return返回存储字节数组*/privatestaticbyte[]date2bytes(intyear,intmonth,intday){byte[]bytes=newbyte[3];bytes[2]=(byte)(((0x7&month)<<5)|(0x1F&day));bytes[1]=(byte)(((0x7F&year)<<1)|((0x8&month)>>3));bytes[0]=(byte)((0x7F80&year)>>7);returnbytes;}/***从存储年月日的3个字节中解析年月日数据*@parambytesbyte待解析数组*@returnreturn长度为3的数组,依次代表年月日*/privatestaticint[]bytes2date(byte[]bytes){int[]date=newint[3];date[2]=字节[2]&0x1F;日期[1]=((字节[1]&0x1)<<3)|((字节[2]&0xE0)>>5);日期[0]=((字节[0]&0xFF)<<7)|((bytes[1]&0xFE)>>1);returndate;}}我们使用2021年12月31日来计算st最终效果:我们可以看到这三个字节存储的值,最后解析这三个字节,还原成我们原来设置的日期。