9

查看其他开发人员编写的一些代码,我遇到了这个:

for($i=1; $i<=30; $i++)
{
  if($i&1)
    $color = '#fff';
  else
    $color = '#bbb';
}

这个 $color 变量在后面的代码中用于行背景颜色。交替的颜色工作正常。

如果我正在写这篇文章,我会使用模数运算符 (%) 而不是按位 (&) 运算符。

为什么按位运算符在这种情况下起作用?使用这种方法而不是模运算符有什么好处吗?

4

2 回答 2

9

运算符对&数字进行按位比较。所以如果你这样做

$i & 1

然后它会告诉您是否设置了“1”标志,例如二进制:

001010111010

最后一个数字是“1”标志(请记住,二进制以相反的顺序依次为 1、2、4、8 等),在本例中设置为 0。

由于 1 是二进制中唯一的奇数标志,它会告诉您该数字是奇数还是偶数。

例如,如果 $i 是 3,那么在二进制中它将是 011 - 最后一个数字是 1(1 标志),因此$i & 1将为真。

例如,如果 $i 是 4,那么在二进制中它将是 100 - 最后一个数字是 0(1 标志),因此$i & 1将为假。

于 2012-07-16T10:17:57.490 回答
4

它之所以有效,是因为如果数字是奇数,则第一位始终为 1,如果数字为偶数,则始终为 0。

  1
 10
 11
100
101
110
111
etc.

理论上,按位运算比模运算快,但解释器可能会将模运算优化为按位运算。

为什么其他开发者使用它,我们只能猜测:出于习惯,从某个地方复制粘贴,不知道模数运算符,炫耀,想要优化......

于 2012-07-16T10:22:19.287 回答