【发布时间】:2014-06-21 22:08:28
【问题描述】:
我目前在php中使用int[]数组实现左移,需要在操作后取回小数。所以我写了以下sn-p来尝试将二进制数组转换为十进制。
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 返回了一个已经不满足循环条件的令人难以置信的值,但我不知道为什么会这样。这是其余的相关代码。
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
我还实现了working version on ideone for testing。有谁明白为什么会这样?
谢谢。
【问题讨论】:
-
我不知道
PHP,但我知道C。我的问题是,这真的是C还是相关的,或者只是被错误地标记了? -
@ThoAppelsin,PHP 基于 C,所以我认为这可能是内部问题/错误。
-
你在使用
string_add时也有类似的问题。基本上,在这两种情况下,$sum都是三倍,而不是两倍。 -
ooga 所说的,据我所知,
$length = count($bin) - 1;行也应该没有- 1。虽然它看起来有点熟悉,但对于像count和string_add这样的内置函数,这对我来说是个问题。此外,按照这种逻辑,每个PHP问题也可能会被自动标记为C。 -
天啊,非常感谢@ooga 和@ThoAppelsin。所以这些实际上是问题的原因,加上我在 bin2dec 中遇到了同样的问题(产生双倍并再次加到总和)。我以为我得到的奇怪的“返回值”实际上是因为
$cr从来都不是 1。将发布工作代码。