Php 简单算法理解困难

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 } 我可以清楚地看到它为什么不

对于这样一个特定的问题,我感到很抱歉,但是看看下面用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
}
我可以清楚地看到它为什么不起作用,但我不确定如何改变算法使其起作用。或多或少,我知道我没有正确地调整算法,因为我不明白它在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);