Php 按位编码是什么$n&;($n-1)“;做
这段代码是什么意思?还有什么其他方法可以在不使用位移位的情况下实现相同的功能Php 按位编码是什么$n&;($n-1)“;做,php,bit-manipulation,bitwise-and,Php,Bit Manipulation,Bitwise And,这段代码是什么意思?还有什么其他方法可以在不使用位移位的情况下实现相同的功能 if ($n & ($n - 1)) 这个公式(如果你写的条件是真的,那么这个数字不是二的幂) 换句话说,您的测试将检查$n的二进制表示中是否设置了多个“1”位。如果设置了零位或只有一位,那么测试将为false 这是迄今为止确定该属性最有效的方法。首先,这段代码是有效的PHP,因此您的标题很差 第二,正在进行的二进制算法如下所示: 42 = 101010 & 41 = 101001 ------
if ($n & ($n - 1))
这个公式(如果你写的条件是真的,那么这个数字不是二的幂)
换句话说,您的测试将检查$n
的二进制表示中是否设置了多个“1”位。如果设置了零位或只有一位,那么测试将为false
这是迄今为止确定该属性最有效的方法。首先,这段代码是有效的PHP,因此您的标题很差 第二,正在进行的二进制算法如下所示:
42 = 101010
&
41 = 101001
-----------
40 = 101000
正如Greg所说,这是检查2次方数字的最快方法,但您给出的代码会检查数字是否不是2次方。PHP的策略很容易确定这一点:任何非空/非零值都是真的。这实际上是一个按位操作,而不是一个位移位。为什么需要避免按位操作呢?因为我不太了解它们,类似的情况可能会帮助我更好地理解它。这不是家庭作业格雷格,问题是,本质上,一个测试一个数字是否不是二的幂的改编。如果没有
==0
PHP将任何非零值都视为true。是的,我认为逻辑否定会很清楚。尽管如此,我还是修改了我的答案,使之更为明确。好吧,乍一看,这不是否定(即!=0
),我对eyze的印象是,他处于初级水平。这很聪明,我以前从未见过这种技巧。我必须在头脑中做一些数学运算来验证这是否可行这是那些“老C黑客的把戏”之一,除了它应该是$n^($n-1)
,它用于查找n的最小“1”位。正如它所写的,它将用你所有的二次幂将0分组。当然,我的版本会将“0”显示为充满了“1”-但是,如果有多个“1”,则可以将其视为一种有用的方式来显示原始数字中没有任何“1”。我希望这有帮助。