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

EOZ*_*Zyo 5 php operators

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

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)


Nic*_*ico 8

&是二进制AND.

奇数AND 1的二进制值为1,偶数AND 1的二进制值为0.

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

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

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