php 超過64位進制和10進制的轉換


有時候想把一個很大的數盡量用更少的空間存儲起來,那么就可以采用很大的進制來存儲它,比如說,一個大於等於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進制進行查詢,特殊格式如果用到了]})這種的時候可能會影響你的業務邏輯,那你需要根據自身業務情況處理一下,或者換其他的符號作為進制符號。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM