有時候想把一個很大的數盡量用更少的空間存儲起來,那么就可以采用很大的進制來存儲它,比如說,一個大於等於10小於等於16數字使用10進制就需要兩位,使用16進制就只需要1位,那就等於幫程序省了一位的空間,數字越大,進制越高,效果也就越明顯。
舉例如下:
| 1000000的轉換比較 | 二進制 | 八進制 | 十進制 | 十六進制 |
| 轉換結果 |
11110100001001000000
|
3641100
|
1000000 |
f4240
|
| 占用存儲長度 |
20
|
7
|
7 |
5
|
現在我們可以看到,十六進制能省下2個長度,然后我們能不能得到一個更高進制?那就能省更多空間了,且看代碼
<?php // need bcmath extension function binaryTo(int $num = 0) { $dict = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,./?<>{}[]|()'; $to = strlen($dict); $ret = ''; do { $ret = $dict[bcmod($num, $to)] . $ret; //bcmod取得高精確度數字的余數。 $num = bcdiv($num, $to); //bcdiv將二個高精確度數字相除。 } while ($num > 0); return $ret; } function binaryFrom(string $num = '') { $num = strval($num); $dict = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ,./?<>{}[]|()'; $from = strlen($dict); $len = strlen($num); $dec = 0; for($i = 0; $i < $len; $i++) { $pos = strpos($dict, $num[$i]); $dec = bcadd(bcmul(bcpow($from, $len - $i - 1), $pos), $dec); } return $dec; } var_dump(binaryTo(1000000)); var_dump(binaryFrom('2rWp'));
這個代碼可能會報錯,如果報錯請檢查是不是沒開啟 bcmath 擴展,沒有這個擴展的你就裝一下,sudo apt search 然后install 一下
此時我們就可以把這個表格更新了,我們看到現在使用這個函數得到的進制結果是 2rWp 那么長度就是4位。
表格更新如下:
| 1000000的轉換比較 | 二進制 | 八進制 | 十進制 | 十六進制 | 七十五進制 |
| 轉換結果 | 11110100001001000000 | 3641100 | 1000000 | f4240 |
2rWp
|
| 占用存儲長度 | 20 | 7 | 7 | 5 | 4 |
我們可能覺得7個長度縮減到4個長度,這並不算什么,但是如果你有一個很大數據量的存儲文本,你存儲了大量的這種id int型的數據,那么就會占用很大的空間,此時你采用這種方式轉換存儲一下,發現文件能減少30%左右,那這個時候該文件的讀寫就能快很多,能減少服務器各方面(硬盤空間 內存空間等)壓力,數據量越多,其效果就越明顯。
當然這里面有副作用,比如我添加的數據需要轉換一次回到10進制,才能給前台使用,查詢的時候也要先轉為75進制進行查詢,特殊格式如果用到了]})這種的時候可能會影響你的業務邏輯,那你需要根據自身業務情況處理一下,或者換其他的符號作為進制符號。
