我总是使用以下内容来查找偶数和奇数:
if( $num % 2 ) { echo "odd"; }
if( !($num % 2) ) { echo "even"; }
但最近我偶然发现以下代码完全相同:
if( $num & 1 ) { echo "odd"; }
if( !($num & 1) ) { echo "even; }
“&”背后的逻辑是什么?在第二种方法?
我去检查了PHP: Arithmetic Operators,&符号不是选项的一部分。
感谢。
答案 0 :(得分:12)
这是bitwise-AND运营商。请记住,在计算机中,每个整数都以二进制形式存储,最低有效位的二进制数字是2 ^ 0 == 1.因此,每个奇数将具有最低的二进制数= 1。
因此,按位AND运算符将您的值逐位与常量1
进行比较。两个操作数中1
的位在结果中设置为1
,但 操作数中0
的位设置为0
在结果中。最终结果(可以是1
或0
)由PHP强制为布尔值,因为您将它用作if()
语句中的子句。
使用&
代替%
检查均匀度是有充分理由的:速度! %
运算符需要除法运算,因此可以计算余数,这在计算上要比直接比较这些位要贵得多。
一个例子:
$num = 9; // 9 == 8 + 1 == 2^3 + 2^0 == 1001b
echo (string)($num & 1); // 1001b & 0001b = 0001b - prints '1'
$num = 10; // 10 == 8 + 2 == 2^3 + 2^1 == 1010b
echo (string)($num & 1); // 1010b & 0001b = 0000b - prints '0'
答案 1 :(得分:8)
&
是二进制AND
。
奇数AND 1的二进制值为1,偶数AND 1的二进制值为0。
这是因为奇数的二进制值总是以1结尾,而偶数的二进制值以0结束。所以......
在奇数的情况下 10101101 & 00000001 = 00000001
,
10101100 & 00000000 = 00000000
。