2017-01-20 31 views
0

假设我有一个函数手动从二进制数计算十进制
*最多4个字符(二进制)
*假设你只能输入0和1个字符计算二进制到十进制手动

下面代码工作完全

function bin_to_dec($bin) { 
$bin = str_split($bin); 
$bin = array_reverse($bin); 

$i = 0; 
$dec = 0; 
foreach($bin as $values) { 
    $ans = $values * pow(2, $i); 
    $dec += $ans; 
    $i++; 
} 

return $dec; 

}

$bin = 1010 //4 
$bin = 1 //1 
$bin = 0 //0 

假设,如果你不能使用函数strrev(),str_split(),array_reverse(),如何将二进制手动转换为十进制?

+1

'$长度= strlen的($斌); for($ i = 0; $ i <$ length; $ i ++){$ offset = $ length - $ i - 1; $ values = $ bin {$ offset}; // ....你的循环代码的其余部分}' –

+0

@MarkBaker谢谢你的回复!你的代码帮助了我很多!我的最终代码是 $ length = strlen($ bin); $ dec = 0; //ver.1 for($ i = 0; $ i <$ length; $ i ++){ $ offset = $ length - $ i - 1; $ values = $ bin [$ offset]; $ ans = $ values * pow(2,$ i); $ dec + = $ ans; } –

+0

@MarkBaker对不起,我的回复很难阅读,缩进和换行似乎不起作用。但是如果在项目中支持substr()函数,这里是我的ver.2代码。 $ length = strlen($ bin); $ dec = 0;对于($ i = 1; $ i <= $ length; $ i ++){ $ values = substr($ bin, - $ i,1); $ ans = $ values * pow(2,$ i-1); $ dec + = $ ans; } 但我仍然比较喜欢第一版,因为它不依赖于php本地函数,所以它会在不同版本上更兼容。的PHP如果功能不能正常工作。 –

回答

0

那么,你有没有试过内置的bindec函数?

var_dump(bindec(1010)); // int(10) 
var_dump(bindec(1)); // int(1) 
var_dump(bindec(101010)); // int(45) 

要小心的是,这个功能是为了与字符串中使用,可以给奇怪的结果与0开始整型:

var_dump(bindec(0101)); // int(0) 
var_dump(bindec("0101")); // int(5) 
+0

感谢您的回复,抱歉我的问题不够清楚,我想手动计算二进制到十进制数,所以我不想使用像bindec()这样的原生php函数。 –

0

http://php.net/manual/en/function.bindec.php

Example bindec() example 

<?php 
echo bindec('110011') . "\n"; 
echo bindec('000110011') . "\n"; 

echo bindec('111'); 
?> 
The above example will output: 

51 
51 
7 
+0

感谢您的回复,对不起,我的问题还不够清楚,我想手动计算二进制到十进制数,所以我不想使用像bindec()这样的原生php函数。 –

+0

@ha_ryu http:// stackoverflow。com/questions/36741587/how-to-convert-binary-to-decimal-without-using-php-native-functions – mwweb

+0

感谢您的回复,但它仍然使用php原生函数explode(); str_replace(); count(); chr(); :) –

0

尝试bindec()功能。

$ret_val = bindec("10001101"); 

这是一个简单的办法,否则,你可以使用...

<?php 
function strev($y) 
{ 
for ($x = strlen($y)-1; $x>=0; $x--) { 
     $y .= $y[$x]; 
     $y[$x] = NULL; 
} 
return $y; 
} 
function bintodec($str){ 
    $dec=0; 
    $nstr=$str; 
    $nstr=strev($nstr); 
    for($i=0;$i<strlen($str);$i++){ 
     $val = ($nstr%pow(10,strlen($nstr)-1)) * pow(2, $i); 
     $dec += $val; 
     $nstr=floor($nstr/10); 
    } 
    return $dec; 
} 
echo bintodec("1111010"); 
?> 
+0

感谢您的回复!我试过你的代码,但它似乎你的函数bintodec()始终返回0。 –