1. 程式人生 > >時間壓縮,讓更少位數儲存年月日時間

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

考慮到硬體儲存的記憶體空間不是很理想,所有在做硬體開發的過程中儘量做壓縮儲存。今天介紹的是時間的壓縮,例如: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"