zoukankan      html  css  js  c++  java
  • 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;
  • 相关阅读:
    Spring Boot 返回 XML 数据,一分钟搞定!
    Spring Cloud Alibaba Sentinel 整合 Feign 的设计实现
    周末去面试,进去 5 分钟就出来了…
    Spring Boot 返回 JSON 数据,一分钟搞定!
    Java 11 已发布,String 还能这样玩!
    Hashtable 为什么不叫 HashTable?
    Java 中初始化 List 集合的 6 种方式!
    HashMap 和 Hashtable 的 6 个区别,最后一个没几个人知道!
    毕业不到一年,绩效打了个D!
    poj 3111 K Best (二分搜索之最大化平均值之01分数规划)
  • 原文地址:https://www.cnblogs.com/caopeng/p/13969152.html
Copyright © 2011-2022 走看看