我总是使用以下内容来查找偶数和奇数:
if( $num % 2 ) { echo "odd"; }
if( !($num % 2) ) { echo "even"; }
Run Code Online (Sandbox Code Playgroud)
但最近我偶然发现以下代码完全相同:
if( $num & 1 ) { echo "odd"; }
if( !($num & 1) ) { echo "even; }
Run Code Online (Sandbox Code Playgroud)
第二种方法中"&"背后的逻辑是什么?
我去检查PHP:算术运算符和&符号不是选项的一部分.
谢谢.
Dre*_*fer 12
它是按位AND运算符.请记住,在计算机中,每个整数都以二进制形式存储,最低有效二进制数字是2 ^ 0 == 1.因此,每个奇数将具有最低的二进制数= 1.
因此,按位AND运算符将您的值逐位与常量进行比较1.这是位1在两个操作数都设置1在结果中,但位,并且0在任何操作设置为0在结果中.最终结果(将是1或者0)由PHP强制为boolean,因为您将它用作语句中的子句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'
Run Code Online (Sandbox Code Playgroud)
&是二进制AND.
奇数AND 1的二进制值为1,偶数AND 1的二进制值为0.
发生这种情况是因为奇数的二进制值总是以1结尾,而偶数的二进制值以0结尾.所以......
10101101 & 00000001 = 00000001 在奇数的情况下,
10101100 & 00000000 = 00000000 在偶数的情况下.