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;