1. 程式人生 > 實用技巧 >PHP演算法 十進位制二進位制互相轉化(含小數)

PHP演算法 十進位制二進位制互相轉化(含小數)

1、二進位制轉換十進位制

原理:小數點前或者整數要從右到左用二進位制的每個數去乘以2的相應次方並遞增,小數點後則是從左往右乘以二的相應負次方並遞減

例:10101.1011 =1*20+0*21+1*22+0*23+1*24.1*2-1+0*2-2+1*2-3+1*2-4= 1+0+4+0+16+0.5+0+0.125+0.0625 =21.6875

abcd.efg = d*20+c*21+b*22+a*23+e*2-1+f*2-2+g*2-3

#程式碼實現

 1 $number = "10101.1011";
 2 $i = 0;
 3 $sum = 0;
 4 $float = 0;
 5 $numberArr = explode
(".",$number); 6 $len = strlen($numberArr['0']); 7 $numberA = strrev($numberArr['0']); //反轉字串 因為整數需要從右到左運算 8 for($i;$i<$len;$i++){ 9 $sum = $sum + $numberA[$i]*pow(2,$i); #運算 從右到左每個數*2的次方遞增 例:*2的0次方 *2的1次方 *2的2次方 *2的3次方 10 } 11 if(strpos($number,".")){ //運算浮點數 12 $i = 0; 13 $len
= strlen($numberArr['1']); 14 for($i;$i<$len;$i++){ 15 $float = $float + $numberArr['1'][$i]*pow(2,-($i+1)); #運算 浮點數從左到右每個數*2的負次方遞減 例:*2的-1次方 *2的-2次方 *2的-3次方 16 } 17 echo "浮點數:".($sum+$float); 18 }else{ 19 echo "整數".$sum; 20 };

2、十進位制轉換二進位制

原理:十進位制整數轉換為二進位制整數採用"除2取餘,逆序排列

"法 整數部分除2有餘數得1 整除得0 以此類推最後調轉資料得出二進位制

   十進位制小數轉換成二進位制小數採用"乘2取整,順序排列"法 小數部分乘2取整數得1取1 得0取0 然後小數部分再乘2 以此類推

例:21.6875 = 21/2 10/2 5/2 2/2 1/2 . 0.6875*2 0.375*2 0.75*2 0.5*2 = 10101.1011

整數位 21/2 = 10.5 有餘數 得 1      小數位 0.6875*2 = 1.375 取得整數位 1

    10/2 = 5   整除 得 0          0.375*2 = 0.75 取得整數位 0

    5/2 = 2.5 有餘數 得 1          0.75*2 = 1.5 取得整數位 1

   2/2 = 1 整除 得 0          0.5*2 = 1 取得整數位 1

   1/2 = 0.5  有餘數 得 1

整數位為0 結束運算 得 10101         小數位為0 結束運算 得1011

拼接得10101.1011

#程式碼實現

 1 $number = "21.6875";
 2 $i = 1;
 3 $arrInt = "";
 4 function integer($number,$i,$arrInt){
 5     for($i;$i>0;$i++){
 6         $decide = $number/2;        //獲取下面的整數繼續除二
 7         $number = floor($number/2);     //除二取整
 8         if(strpos($decide,".")){
 9             $arrInt = "1".$arrInt;    //浮點數位   1 1000001  101000001
10         }else{
11             $arrInt = "0".$arrInt;    //整數位     01  001  0001  00001 000001 01000001
12         }
13         if($decide  < 1){
14             $i = -1;
15         }
16     }
17     return $arrInt;
18 }
19 function floating($float,$i,$arrInt){
20     for($i;$i<50;$i++){
21         $decide = $float*2;     //浮點數乘二 
22         if($decide == 1){
23             $i = 51;
24         }else{
25             $float = "0.".explode(".",$decide)['1'];     //獲取乘二後的浮點數  供上面繼續運算     
26         }
27         if($decide >= 1){
28             $arrInt = $arrInt."1";    //浮點數位   
29         }else{
30             $arrInt = $arrInt."0";    //整數位     
31         }
32     }
33     return $arrInt;
34 }
35 if(!strpos($number,".")){
36     $result = integer($number,$i,$arrInt);      //返回整數轉換的二進位制
37 }else{
38     $numberInt = floor($number);                //取得浮點數的整數位
39     $int = integer($numberInt,$i,$arrInt);              //返回整數轉換的二進位制
40     $numberFloat = "0.".explode(".",$number)['1'];
41     $flo = floating($numberFloat,$i,$arrInt);       //返回浮點數轉換的二進位制
42     $result = $int.".".$flo;  
43 }
44 echo $result;