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