時間壓縮,讓更少位數儲存年月日時間
阿新 • • 發佈:2019-02-12
考慮到硬體儲存的記憶體空間不是很理想,所有在做硬體開發的過程中儘量做壓縮儲存。今天介紹的是時間的壓縮,例如:2028-08-29,可能我們在儲存的時候需要用10位int型別去存它的時間戳,但是今天我想用4位string去存。沒錯,我就是壓縮成2個位元組16進位制的字串,而2028-08-29對應的就是‘3CD8’。
當然做這個壓縮我們是有位元組的規則的,下面是我們的時間壓縮規則
兩個位元組,16個bit。年用5個bit,放在第一個位元組後5位;月用4個bit,放在第二個位元組最後4位;日用4個bit,放在第二個位元組前4位。也行說到這,你也很疑惑。2028年4位數的年,可以用5個bit表示嗎?沒錯,4位數的年2028確實不能用5個bit表示,但是我們之前就說了,做這個時間壓縮我們用自己的規則,那就是年我們自取後兩位,像2028我們自取28,5個bit最大為31,我想說2031年這個軟體也應該升級了吧。
下面說下這個壓縮規則吧,年用'&'表示、月用'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"