php 實現進位相互轉換的方法

來源:互聯網
上載者:User
最近的項目中需要用到進位轉換,這個問題在剛剛接觸電腦理論時候,還是很會的,好久不用,居然模糊了……

從十進位向其它進位轉換,用的是就用該數字不斷除以要轉換的進位數,讀取餘數。串連一起就可以了。

<?php /** *十進位轉二進位、八進位、十六進位 不足位元前面補零* * * @param array $datalist 傳入資料array(100,123,130) * @param int $bin 轉換的進位可以是:2,8,16 * @return array 返回資料 array() 返回沒有資料轉換的格式 */function decto_bin($datalist,$bin){  static $arr=array(0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F');  if(!is_array($datalist)) $datalist=array($datalist);  if($bin==10)return $datalist; //相同進位忽略  $bytelen=ceil(16/$bin); //獲得如果是$bin進位,一個位元組的長度  $aOutChar=array();  foreach ($datalist as $num)  {    $t="";    $num=intval($num);  if($num===0)continue;    while($num>0)    {      $t=$arr[$num%$bin].$t;      $num=floor($num/$bin);    }    $tlen=strlen($t);    if($tlen%$bytelen!=0)    {    $pad_len=$bytelen-$tlen%$bytelen;    $t=str_pad("",$pad_len,"0",STR_PAD_LEFT).$t; //不足一個位元組長度,自動前面補充0    }    $aOutChar[]=$t;  }  return $aOutChar;}

測試:

var_dump(decto_bin(array(128,253),2));var_dump(decto_bin(array(128,253),8));var_dump(decto_bin(array(128,253),16));X-Powered-By: PHP/5.2.0Content-type: text/htmlarray(2) { [0]=> string(8) "10000000" [1]=> string(8) "11111101"}array(2) { [0]=> string(4) "0200" [1]=> string(4) "0375"}array(2) { [0]=> string(2) "80" [1]=> string(2) "FD"}

二進位、八進位、十六進位轉十進位

這個轉換用乘法,如:1101 轉十進位:1*2^3+1*2^2+0*2^1+1*2^0

代碼:

<?php /** *二進位、八進位、十六進位 轉十進位* * * @param array $datalist 傳入資料array(df,ef) * @param int $bin 轉換的進位可以是:2,8,16 * @return array 返回資料 array() 返回沒有資料轉換的格式 * @copyright chengmo QQ:8292669 */function bin_todec($datalist,$bin){  static $arr=array('0'=>0,'1'=>1,'2'=>2,'3'=>3,'4'=>4,'5'=>5,'6'=>6,'7'=>7,'8'=>8,'9'=>9,'A'=>10,'B'=>11,'C'=>12,'D'=>13,'E'=>14,'F'=>15);  if(!is_array($datalist))$datalist=array($datalist);  if($bin==10)return $datalist; //為10進位不轉換  $aOutData=array(); //定義輸出儲存數組  foreach ($datalist as $num)  {    $atnum=str_split($num); //將字串分割為單個字元數組    $atlen=count($atnum);    $total=0;    $i=1;    foreach ($atnum as $tv)    {      $tv=strtoupper($tv);             if(array_key_exists($tv,$arr))      {        if($arr[$tv]==0)continue;        $total=$total+$arr[$tv]*pow($bin,$atlen-$i);      }      $i++;    }    $aOutData[]=$total;  }  return $aOutData;}

測試:

var_dump(bin_todec(array('ff','ff33','cc33'),16));var_dump(bin_todec(array('1101101','111101101'),2));var_dump(bin_todec(array('1234123','12341'),8));X-Powered-By: PHP/5.2.0Content-type: text/htmlarray(3) { [0]=> int(255) [1]=> int(65331) [2]=> int(52275)}array(2) { [0]=> int(124) [1]=> int(508)}array(2) { [0]=> int(342099) [1]=> int(5345)}

這些只是實現方式,其實不在乎php語言還是其它,實現思路都是一樣的。php其實內建不少函數可以完成這些內容:

bindec(),decoct(),dechex() base_convert() decbin() 這裡只是實現思路而已。呵呵!

總結:以上就是本篇文的全部內容,希望能對大家的學習有所協助。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.