& 和 >> 是两个不同的按位运算符 http://en.wikipedia.org/wiki/Bitwise_operation (PHP 中的位运算符 http://php.net/manual/en/language.operators.bitwise.php)。它们使用值的位表示,这为我们提供了一些有用(且快速!)的可能性。
>> is 右移 http://en.wikipedia.org/wiki/Logical_shift。如果右移一个值,则会将表示形式中的所有位移至右侧。如果你有“11100”并将其右移两位,则剩下“111”(右端移出的位消失)。 >> 右侧的数字表示要移位的位数。
& is 按位和 http://en.wikipedia.org/wiki/Bitwise_operation#AND。如果您有两个表示为 111000 和 101011 的值,并决定对它们进行按位求和,则最终会得到 101000(两个值中相同位设置的位将为 1,否则为 0)。
现在我们已经有了理解上面代码所需的一切。 $rgb 包含一个整数值(该值并不有趣,但位模式很有趣),它表示 24 位(RGBA 为 32 位,但我们在这里忽略它)。该值由 8 位红色、8 位绿色和 8 位蓝色组成。然而,我们并不关心这 24 位一起代表什么数字,而是关心单独的 R、G 和 B 值是什么。
我们的值代表颜色的以下位:
rrrrrrrr gggggggg bbbbbbbb
如果我们用 >> 16 移动这个位掩码,我们将得到:
rrrrrrrr
这就是 >> 16 所做的,只留下代表红色的位。由于我们现在已将位一直向下移动,因此该值表示 [0, 255] 中的数字。然后我们添加 & 255(此处以十六进制表示法写为 0xFF)以删除我们感兴趣的 8 以上的任何杂散位。当我们查看如何获取 G 值时,我们现在将了解这是如何发生的:
我们的价值观依然勇敢地代表着不同的颜色:
rrrrrrrr gggggggg bbbbbbbb
如果我们用 >> 8 将该位掩码移动 8 位,我们将得到:
rrrrrrrr gggggggg
可是等等!这不仅仅是代表g的位,还有代表r的位!这不是我们想要的值(因为我们只想要 g)。在前面的例子中我们很幸运,因为我们没有在 r 之上设置任何位,但是这一次我们真的完成了我们的工作。但我们了解 &,现在是时候真正了解它的内容了。
我们现在有:
rrrrrrrr gggggggg
然后我们应用&255(代码中的0xFF),它以位值表示为:
00000000 11111111
由于 & 只保留两个操作数中设置的位,因此我们最终只会得到 g 值:
gggggggg
移位后的值中表示红色的位现在为 0,我们只剩下表示原始颜色的绿色的位。由于它们已被移位到表示 [0, 255] 的相同 8 位,因此我们再次获得了值。
最后一个值更容易,因为它已经位于我们想要的位置:在表示 [0, 255] 的位中。我们可以在这里只进行 & 操作,然后从另一边退出:
rrrrrrrr gggggggg bbbbbbbb &
00000000 00000000 11111111
最终结果是:
bbbbbbbb
我们也得到了蓝色值。
希望能解释一下!