5

我一直使用以下方法来查找偶数和奇数:

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

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

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

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

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

谢谢。

4

2 回答 2

12

它是按位与运算符。请记住,在计算机中,每个整数都以二进制形式存储,最低有效二进制位是 2^0 == 1。因此,每个奇数的最低二进制位 = 1。

因此,按位 AND 运算符将您的值逐位与常量进行比较11两个操作数中的位在结果中设置为,1一操作数中的位在结果中设置0为。最终结果(将是or )被 PHP 强制转换为布尔值,因为您将它用作语句中的子句。010if()

&使用而不是检查均匀度有一个很好的理由%:速度!该%运算符需要进行除法运算,因此可以计算余数,这在计算上比直接比较位要昂贵得多。

一个例子:

$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'
于 2013-06-18T18:13:36.530 回答
8

&是二进制AND

奇数与 1 的二进制值为 1,偶数与 1 的二进制值为 0。

发生这种情况是因为奇数的二进制值总是以 1 结尾,而偶数的二进制值总是以 0 结尾。所以...

10101101 & 00000001 = 00000001在奇数的情况下,并且,

10101100 & 00000000 = 00000000在偶数的情况下。

于 2013-06-18T18:20:31.563 回答