2

对这样一个具体问题感到抱歉,但在查看以下用 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 中是如何工作的。

不管怎样,请帮助我!我并不特别希望有人为我解决我的问题,但正确方向的提示会非常棒。:(

非常感谢。

4

6 回答 6

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 次方!

有关的

于 2012-07-11T07:41:26.650 回答
2

那是按位运算:

http://en.wikipedia.org/wiki/Bitwise_operation

http://php.net/manual/en/language.operators.bitwise.php

于 2012-07-11T07:40:47.100 回答
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;
}
于 2012-07-11T07:41:51.563 回答
1

我认为它返回最接近 2 的下一个幂。对于 2 的幂,a & (a-1) 返回 0。

编辑:

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

于 2012-07-11T07:41:53.743 回答
0
a & (a-1)

将按位与 a 和 (a-1)

在php中

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

也应该工作。

于 2012-07-11T07:42:18.783 回答
0
a & (a-1);

a该语句在和之间进行按位与运算a-1链接向您解释按位操作。在 PHP 中,您可以使用&运算符进行 AND 操作。是与PHP相关的链接。

于 2012-07-11T07:55:54.617 回答