将二进制数组转换为十进制字符串的奇怪行为 [英] Converting binary array to decimal string strange behaviour

查看:92
本文介绍了将二进制数组转换为十进制字符串的奇怪行为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在使用php中的int[]数组实现左移,需要在操作后取小数.因此,我编写了以下代码段,尝试将二进制数组转换为十进制.

I'm currently implement left shift using int[] arrays in php and need to get back the decimal after operation. So I have written the following snippet to attempt conversion of binary array to decimal.

function bin2dec($bin)
{
    $length = count($bin) - 1;
    $sum = 0;
    //convert using doubling
    for($i = 0; $i < $length; $i++)
    {
        //use string_add if doubling bigger than int32
        if($i >= 16)
        {
            $double = $this->string_add("$sum", "$sum");
            $cr = $bin[$i];
            if($cr == 0)
            {
                $sum = $this->string_add($sum, $double);
            }
            else{
                return $i;//WHAT's UP??!
                $add = $this->string_add($double, "$cr");
                $sum = $this->string_add($sum, $add);
            }
        }
        else{
            $sum += ($sum * 2) + $bin[$i];
        }
    }
    return $sum;
}

现在怪异的问题出现在循环中,其中$cr != 0$i返回一个不满足循环条件的令人难以置信的值,但我不知道为什么会这样.这是其余的相关代码.

Now the weird problem is in the loop where $cr != 0, $i returns an unbelievable value already not satisfying the loop condition but I can't figure out why this is happening. Here's the rest of the relevant code.

function string_add($a, $b)
{
    $lena = strlen($a); $lenb = strlen($b);
    if($lena == $lenb)
    {
        $len = $lena - 1;//any
    }
    else if($lena > $lenb)
    {
        $b = str_pad($b, $lena, "0", STR_PAD_LEFT);
        $len = $lena - 1;
    }
    else if($lenb > $lena){
        $a = str_pad($a, $lenb, "0", STR_PAD_RIGHT);
        $len = $lenb - 1;
    }
    $result = "";
    for ($i = $len, $carry = 0; $i >= 0 || $carry != 0; $i--)
    {
        $add1 = $i < 0 ? 0 : $a[$i];
        $add2 = $i < 0 ? 0 : $b[$i];
        $add = $add1 + $add2 + $carry;
        if ($add > 9) {
            $carry = 1;
            $add -= 10;
        }
        else {
            $carry = 0;
        }
        $result .= $add;
    }
    return strrev($result);
}

$arr = array_pad(array(1), 62, 0);
$dec = bin2dec($arr);
return $dec;//test

我还在ideone上实现了工作版本.有人知道为什么会这样吗?

I have also implemented a working version on ideone for testing. Does anyone understand why this is happening?

谢谢.

推荐答案

好吧,因此显然问题超出了所需的范围,并且不必要在bin2dec中从长度中减去1.这是最终的工作版本:

Ok, so apparently the problem was adding more than needed and unnecessarily subtracting 1 from length in bin2dec. Here's the final working version:

<?php
class MyClass{
    function bin2dec($bin)
    {
        $length = count($bin);
        $sum = 0;
        //convert using doubling
        for($i = 0; $i < $length; $i++)
        {
            //use string_add if doubling bigger than int32
            if($i >= 16)
            {
                $sum = $this->string_add("$sum", "$sum");
                $cr = $bin[$i];
                if($cr != 0){
                    $sum = $this->string_add($sum, "$cr");
                }
            }
            else{
                $sum += $sum + $bin[$i];
            }
        }
        return $sum;
    }

    function string_add($a, $b)
    {
        $lena = strlen($a); $lenb = strlen($b);
        if($lena == $lenb)
        {
            $len = $lena - 1;//any
        }
        else if($lena > $lenb)
        {
            $b = str_pad($b, $lena, "0", STR_PAD_LEFT);
            $len = $lena - 1;
        }
        else if($lenb > $lena){
            $a = str_pad($a, $lenb, "0", STR_PAD_RIGHT);
            $len = $lenb - 1;
        }
        $result = "";
        for ($i = $len, $carry = 0; $i >= 0 || $carry != 0; $i--)
        {
            $add1 = $i < 0 ? 0 : $a[$i];
            $add2 = $i < 0 ? 0 : $b[$i];
            $add = $add1 + $add2 + $carry;
            if ($add > 9) {
                $carry = 1;
                $add -= 10;
            }
            else {
                $carry = 0;
            }
            $result .= $add;
        }
        return strrev($result);
    }
}

$man = new MyClass();
$arr = array_pad(array(1), 62, 0);
$dec = $man->bin2dec($arr);
echo $dec;

这篇关于将二进制数组转换为十进制字符串的奇怪行为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆