麻烦理解简单的算法

时间:2012-07-11 07:37:21

标签: php javascript algorithm infinite-loop

对于这样一个特定的问题感到抱歉,但是看了下面用Javascript编写的算法

  function c(a) {
    if (a < 2) return 2;
    if (a > 4096) return 4096;
    var b = a & (a - 1);
    while (b > 0) {
        a++;
        b = a & (a - 1)
    }
    return a
}

我遇到了一个我不确定的声明。 var b = a & (a - 1);究竟做了什么?我假设它将A分配给B然后从B减去1,但是,如果是这种情况那么B不会达到0(或低于0)导致无限循环?这怎么可行?

我问这个是因为我试图让算法适应PHP,但已经碰壁了。它在Javascript中完美运行,所以我肯定知道我不知道发生了什么。这是我在PHP中的尝试:

function c($a) {
    if ($a < 2) return 2;
    if ($a > 4096) return 4096;
        $b = $a 
        $b = ($b - 1);
    while ($b > 0) {
        $a++;
        $b = $a;
        $b -= 1;   
    }
    return $b;
}

我可以清楚地看到为什么它不起作用但我不确定如何更改算法以使其工作。或多或少,我知道我没有正确调整算法因为我不明白它在Javascript中是如何工作的。

无论哪种方式,请帮助我!我并不特别希望有人为我解决我的问题,但是正确方向的提示真的很棒。 :(

非常感谢。

6 个答案:

答案 0 :(得分:12)

该行清除a值中的最低设置位,并将结果分配给b

示例:

00010100110101111000

成为:

00010100110101110000
                ^

它的工作原理是减去一个将所有位翻转到包括设置的最低有效位。所有其他位保持不变。使用按位 - 并保留所有未更改的位。

00010100110101111000  a
00010100110101110111  a-1
00010100110101110000  a & (a-1)

此循环重复向a添加一个,直到清除a的一位给出零:

b = a & (a - 1);
while (b > 0) {
    a++;
    b = a & (a - 1);
}

换句话说,它以非常低效的方式将a四舍五入到最接近的2的幂!

相关

答案 1 :(得分:2)

答案 2 :(得分:2)

它是一样的。

function c($a) {
    if ($a < 2) return 2;
    if ($a > 4096) return 4096;
    $b = $a & ($a - 1);
    while ($b > 0) {
       $a++;
       $b = $a & ($a - 1);
    }
    return $b;
}

答案 3 :(得分:1)

我认为它返回最接近的2次幂。对于2 a&amp;的功率。 (a-1)返回0.

编辑:

我刚用Java检查过这个。它确实返回2的下一个幂。当a为6时,它返回8.当a为9时,它返回16.如果a为2,则返回2.

答案 4 :(得分:0)

a & (a-1)

将执行按位和a和(a-1)

在php中

$b = $a & ($a-1)

也应该有用。

答案 5 :(得分:0)

a & (a-1);

此声明在aa-1之间进行逐位AND操作。 This链接向您解释有关按位操作的信息。在PHP中,您可以使用&运算符进行AND运算。 Here是与PHP相关的链接。