Php 简单算法理解困难
对于这样一个特定的问题,我感到很抱歉,但是看看下面用Javascript编写的算法Php 简单算法理解困难,php,javascript,algorithm,infinite-loop,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 } 我可以清楚地看到它为什么不
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
}
我可以清楚地看到它为什么不起作用,但我不确定如何改变算法使其起作用。或多或少,我知道我没有正确地调整算法,因为我不明白它在Javascript中是如何工作的
不管怎样,请帮帮我!我并不特别希望有人能帮我解决问题,但给我一个正确方向的提示就太好了(
非常感谢。这是一种按位操作: 该行清除
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次方
相关的
- 这是一样的
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;
}
功能c($a){
如果($a<2)返回2;
如果($a>4096),则返回4096;
$b=$a&($a-1);
而($b>0){
$a++;
$b=$a&($a-1);
}
返回$b;
}
我认为它返回最接近的次幂2。对于次幂2,a&(a-1)返回0
编辑:
我刚刚在Java中检查过这个。它确实返回2的下一次幂。当a为6时,它返回8。当a为9时,它返回16。如果a为2,它返回2
a & (a-1)
将对a和(a-1)进行位and运算
在php中
$b = $a & ($a-1)
应该也行
a & (a-1);
此语句在
a
和a-1
之间执行逐位AND运算。链接向您解释逐位运算。在PHP中,您可以使用&
运算符进行AND运算。链接是否与PHP相关。不确定我为什么被否决,但请检查未说明问题的正确答案。:)但是,是的:原始函数是一种非常无效的方法,无法获得下一个更高的二次幂(被2和4096钳制)。如果您查看二进制形式的数字,您会注意到它们包含两个一。但是,例如,如果尝试15
,表达式将返回14
。您意外地选择了它适用的数字。是的,重复应用该公式确实会在一段时间后产生2的幂,但仅a&(a-1)
就不能。这就是我的意思。函数返回2的下一次幂。非常感谢。我现在完全明白了。:)
a & (a-1);