2

可能重复:
参考 - 这个符号在 PHP 中是什么意思?

我正在处理一些遗留代码,我遇到了以下函数:

function is_odd($number) {
   return $number & 1; // 0 = even, 1 = odd
}

我从来没有见过一种方法来检查一个数字是否像以前那样写成奇数,我只是想了解他们实际上在做什么。

4

1 回答 1

7

&是一个按位与,它基本上可以工作,因此对于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 时,结果才为真。

于 2013-02-01T13:59:17.630 回答