这个for循环返回正确的二进制值,但是为它添加了很多0,为什么会这样做呢?

问题描述 投票:1回答:2

对于练习,我编写了这个小循环,将十进制数转换为二进制数。它返回正确的值,我测试了它,但它在输出中附加了很多零。

$dec = 17;

$bin = null;

while($dec != 0)
{
    $bin .= $dec % 2;
    $dec /= 2;
    round($dec, 0, PHP_ROUND_HALF_DOWN);
}

echo $bin;

我真的不知道为什么会这样,我是盲人吗?你能给我一个解释吗?我会很感激。

我试图测试$dec == 0,如果成功break;像这样:

while($dec != 0)
{
    $bin .= $dec % 2;
    $dec /= 2;
    round($dec, 0, PHP_ROUND_HALF_DOWN);
    if($dec == 0)
    {
        break;
    }
}

那没用。所以我正在寻找解决方案。我在这里先向您的帮助表示感谢!乔纳

php loops while-loop binary decimal
2个回答
3
投票

循环的问题是$dec /= 2不是整数除法。如果在循环中打印出$dec,您将看到值为8.5,4.25,2.125,......等等,直到最终$dec成为可能的最小双精度值,此时在下一个循环中它最终变为0。你正在调用round,它应该解决这个问题,你没有将round的输出分配给$dec所以它没有效果。最好先进行整数除法。在PHP7及更高版本中,您可以使用intdiv

$dec = intdiv($dec, 2);

或者在任何PHP版本中,简单的右移都有效:

$dec = $dec >> 1;

否则,您可以使用intvalfloorround(int)强制转换将浮点结果转换为整数:

$dec = intval($dec / 2);
$dec = floor($dec / 2);
$dec = round($dec / 2, 0, PHP_ROUND_HALF_DOWN);
$dec = (int)($dec / 2);

Demo on 3v4l.org

另一个问题是您需要以相反的顺序将值推入$bin字符串,因此您需要更换

$bin .= $dec % 2;

$bin = ($dec % 2) . $bin;

所以一个示例循环将是:

$dec = 24;    
$bin = null;
while($dec != 0)
{
    $bin = ($dec % 2) . $bin;
    $dec = $dec >> 1;
}
echo $bin . PHP_EOL;

输出:

11000

2
投票

好吧,我发现了你的问题:如果你已经调试了你的循环,你会发现$dec在每一步都只有一半。对round的调用不会执行任何操作,因为您不使用返回的值。只需将其分配给$dec

© www.soinside.com 2019 - 2024. All rights reserved.