PHP演算法 十進位制二進位制互相轉化(含小數)
阿新 • • 發佈:2020-11-13
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;