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;
原文地址:https://www.cnblogs.com/caopeng/p/13969152.html