查看其他开发人员编写的一些代码,我遇到了这个:
for($i=1; $i<=30; $i++)
{
if($i&1)
$color = '#fff';
else
$color = '#bbb';
}
这个 $color 变量在后面的代码中用于行背景颜色。交替的颜色工作正常。
如果我正在写这篇文章,我会使用模数运算符 (%) 而不是按位 (&) 运算符。
为什么按位运算符在这种情况下起作用?使用这种方法而不是模运算符有什么好处吗?
查看其他开发人员编写的一些代码,我遇到了这个:
for($i=1; $i<=30; $i++)
{
if($i&1)
$color = '#fff';
else
$color = '#bbb';
}
这个 $color 变量在后面的代码中用于行背景颜色。交替的颜色工作正常。
如果我正在写这篇文章,我会使用模数运算符 (%) 而不是按位 (&) 运算符。
为什么按位运算符在这种情况下起作用?使用这种方法而不是模运算符有什么好处吗?
运算符对&
数字进行按位比较。所以如果你这样做
$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
将为假。
它之所以有效,是因为如果数字是奇数,则第一位始终为 1,如果数字为偶数,则始终为 0。
1
10
11
100
101
110
111
etc.
理论上,按位运算比模运算快,但解释器可能会将模运算优化为按位运算。
为什么其他开发者使用它,我们只能猜测:出于习惯,从某个地方复制粘贴,不知道模数运算符,炫耀,想要优化......