奇数和偶数(使用&或%)

时间:2013-06-18 18:12:01

标签: php operators

我总是使用以下内容来查找偶数和奇数:

if(   $num % 2  ) { echo "odd"; }
if( !($num % 2) ) { echo "even"; }

但最近我偶然发现以下代码完全相同:

if(   $num & 1  ) { echo "odd"; }
if( !($num & 1) ) { echo "even; }

“&”背后的逻辑是什么?在第二种方法?

我去检查了PHP: Arithmetic Operators,&符号不是选项的一部分。

感谢。

2 个答案:

答案 0 :(得分:12)

这是bitwise-AND运营商。请记住,在计算机中,每个整数都以二进制形式存储,最低有效位的二进制数字是2​​ ^ 0 == 1.因此,每个奇数将具有最低的二进制数= 1。

因此,按位AND运算符将您的值逐位与常量1进行比较。两个操作数中1的位在结果中设置为1,但 操作数中0的位设置为0在结果中。最终结果(可以是10)由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