Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按位编码是什么$n&;($n-1)“;做_Php_Bit Manipulation_Bitwise And - Fatal编程技术网

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”。我希望这有帮助。