時間壓縮,讓更少位數儲存年月日時間

2021-08-26 23:22:32 字數 1217 閱讀 8255

考慮到硬體儲存的記憶體空間不是很理想,所有在做硬體開發的過程中盡量做壓縮儲存。今天介紹的是時間的壓縮,例如:2028-08-29,可能我們在儲存的時候需要用10位int型別去存它的時間戳,但是今天我想用4位string去存。沒錯,我就是壓縮成2個位元組16進製制的字串,而2028-08-29對應的就是『3cd8』。

當然做這個壓縮我們是有位元組的規則的,下面是我們的時間壓縮規則

兩個位元組,16個bit。年用5個bit,放在第乙個位元組後5位;月用4個bit,放在第二個位元組最後4位;日用4個bit,放在第二個位元組前4位。也行說到這,你也很疑惑。2023年4位數的年,可以用5個bit表示嗎?沒錯,4位數的年2028確實不能用5個bit表示,但是我們之前就說了,做這個時間壓縮我們用自己的規則,那就是年我們自取後兩位,像2028我們自取28,5個bit最大為31,我想說2023年這個軟體也應該公升級了吧。

下面說下這個壓縮規則吧,年用'&'表示、月用'o表示、日用'*'表示。年放在第乙個位元組後5位,月放在第二個位元組後4位,日的第一位放在第乙個位元組的第一位,後四位放在第二個位元組的前四位。下面看下具體的轉換過程。

10進製:28  -- 2進製:00011100

10進製:08  -- 2進製:00001000

10進製:29  -- 2進製:00011101

那麼按照上面的規則,就可以得到:00111100 11011000

那麼這個兩個位元組對應16進製制分別為:

2進製:00111100   -- 16進製制:3c

2進製:11011000   -- 16進製制:d8

所有得到兩個位元組分別是3cd8,再看下用**怎麼實現

<?php 

$y=28;//年

$m=8;//月

$d=29;//日

$a1=($d&16)<<1;

$a2=$y&31;

$a=$a1|$a2;

$b1=($d&15)<<4;

$b2=$m&15;

$b=$b1|$b2;

var_dump($a);

var_dump($b);

$aa=dechex($a);//10進製轉16進製制

$bb=dechex($b);

var_dump($aa);

var_dump($bb);

?>

執行結果:

int(60) int(216) string(2) "3c" string(2) "d8"

Java Calendar獲取年 月 日 時間

calendar c calendar.getinstance timezone.gettimezone gmt 08 00 獲取東八區時間 int year c.get calendar.year 獲取年 int month c.get calendar.month 1 獲取月份,0表示1月份 i...

Calendar獲取年 月 日 時間

calendar c calendar.getinstance timezone.gettimezone gmt 08 00 獲取東八區時間 int year c.get calendar.year 獲取年 int month c.get calendar.month 1 獲取月份,0表示1月份 i...

天干地支計算年月日時

因過年前家裡進夥 喬遷 讓當地的先生選了時辰,通過對天干地支的了解,對古人的智慧型尤為驚嘆,因此,學習了一下。特此,記錄所學內容。天干地支,簡稱為干支,源自中國遠古時代對天象的觀測 天乾 甲 ji 乙 y 丙 b ng 丁 d ng 戊 w 己 j 庚 g ng 辛 x n 壬 r n 癸 gu 地...