【问题标题】:calculate binary to decimal manually手动计算二进制到十进制
【发布时间】:2017-06-05 06:50:52
【问题描述】:

假设我有一个从二进制数手动计算十进制的函数
*最多四个字符(二进制)
*假设你只能输入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(),你将如何手动将二进制转换为十进制?

【问题讨论】:

  • $length = strlen($bin); for($i = 0; $i < $length; $i++) { $offset = $length - $i - 1; $values = $bin{$offset}; // .... rest of your loop code here }
  • @MarkBaker 感谢您的回复!你的代码对我帮助很大!我的最终代码是 $length = strlen($bin); $dec = 0; //ver.1 for($i = 0; $i
  • @MarkBaker 抱歉,我的回复很难阅读,缩进和换行似乎在评论中不起作用。但如果项目中支持 substr() 函数,这是我的第 2 版代码。 $length = strlen($bin); $dec = 0; for($i = 1; $i

标签: php binary decimal


【解决方案1】:

嗯,你试过内置的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)

【讨论】:

  • 谢谢你的回复,抱歉我的问题不够清楚,我想手动计算二进制到十进制所以我不想使用bindec()这​​样的原生php函数。
【解决方案2】:

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

【讨论】:

  • 感谢您的回复,抱歉我的问题不够清楚,我想手动计算二进制到十进制,所以我不想使用像bindec()这样的原生php函数。
  • 谢谢你的回复,不过还是用php原生函数,explode(); str_replace();数数(); chr(); :)
【解决方案3】:

试试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");
?>

【讨论】:

  • 感谢您的回复!我试过你的代码,但你的函数 bintodec() 似乎一直返回 0。
【解决方案4】:

只需要为一个学生解决这个问题。

  1. 将字符串表示拆分为数字
  2. 颠倒数字
  3. 启动我们的结果
  4. 遍历所有数字,如果数字是 1,则在索引的幂中加上 2

利用二进制中的每个数字将数字索引的幂加 2 到结果的事实。

二进制 11 等于 2^0 + 2^1 = 3

function binaryToDecimal($str) {
    $digits = str_split($str);
    $reversed = array_reverse($digits);
    $res = 0;

    for($x=0; $x < count($reversed); $x++) {
        if($reversed[$x] == 1) {
            $res += pow(2, $x);
        }
    }

    return $res;
}

【讨论】:

    猜你喜欢
    • 2019-09-22
    • 2020-02-10
    • 2021-03-05
    • 1970-01-01
    • 2021-03-02
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多