可能重复:
参考 - 这个符号在 PHP 中是什么意思?
我正在处理一些遗留代码,我遇到了以下函数:
function is_odd($number) {
return $number & 1; // 0 = even, 1 = odd
}
我从来没有见过一种方法来检查一个数字是否像以前那样写成奇数,我只是想了解他们实际上在做什么。
可能重复:
参考 - 这个符号在 PHP 中是什么意思?
我正在处理一些遗留代码,我遇到了以下函数:
function is_odd($number) {
return $number & 1; // 0 = even, 1 = odd
}
我从来没有见过一种方法来检查一个数字是否像以前那样写成奇数,我只是想了解他们实际上在做什么。
&
是一个按位与,它基本上可以工作,因此对于1
两个操作数中的每一位,它都会产生1
结果值和0
所有其他位。如果将任何数字转换为其位表示,您很快就会看到它是确定数字是偶数还是奇数的最低位,例如:
5 = 101
10 = 1010
13 = 1101
1030 = 10000000110
最低位(最右边的位,也称为最低有效位)对于每个奇数为 1,对于每个偶数为 0。除了最低位之外的所有其他位总是$n & 1
会产生0
(因为数字 1 只有一个位,您可以想象其余位用 0 左填充以匹配另一个操作数的长度)。所以基本上这个操作归结为比较操作数的最低位,并且1 & 1
是1,所有其他组合都是0。所以基本上当$n & 1
产生1时,它意味着数字是奇数,否则它是偶数。
编辑。
这里有几个例子来演示我之前给出的示例值的按位和工作原理,括号中的数字是原始的十进制数:
101 (5)
& 001 (1)
---
001 (1) = true
1010 (10)
& 0001 (1)
----
0000 (0) = false
1101 (13)
& 0001 (1)
----
0001 (1) = true
10000000110 (1030)
& 00000000001 (1)
-----------
00000000000 (0) = false
从这里你可以很容易地看到,只有当两个操作数的最右边的位都是 1 时,结果才为真。