& 和 >> 是两个不同的位运算符(PHP 中的位运算符)。它们使用值的位表示,这为我们提供了一些有用(而且快速!)的可能性。
>>是右移。如果您右移一个值,您将在表示中向右移动所有位。如果您有“11100”并将其右移两个位置,则剩下“111”(右端移出的位消失)。>> 右侧的数字表示要移位的位数。
&是按位和。如果您有两个值表示为 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
我们也有我们的蓝色价值。
希望能解释清楚!