&と>>は、2つの異なるビット演算子(PHPのビット演算子)です。それらは値のビット表現で動作し、いくつかの有用な(そして速い!)可能性を与えてくれます。
>>は右シフトです。値を右シフトすると、表現のすべてのビットが右に移動します。「11100」を持っていて、それを2桁右にシフトすると、「111」が残ります(右端でシフトオフされたビットが消えます)。>>の右側の数字は、シフトするビット数を示します。
&はビット単位であり、。111000と101011として表される2つの値があり、それらをビット単位で指定すると、最終的に101000になります(両方の値の同じビットが設定されているビットは1になり、それ以外の場合は0になります)。
これで、上記のコードを理解するために必要なものが揃いました。$ rgbには、24ビット(RGBAの場合は32ビットですが、ここでは無視します)を表す整数値(値は重要ではありませんが、ビットパターンは重要です)が含まれています。値は、赤の場合は8ビット、緑の場合は8ビット、青の場合は8ビットで構成されます。ただし、これらの24ビットが一緒に何を表すかではなく、個別のR、G、およびBの値が何であるかに関心があります。
私たちの値は、色の次のビットを表します。
rrrrrrrr gggggggg bbbbbbbb
このビットマスクを>>16でシフトすると、次のようになります。
rrrrrrrr
これは>>16が行うことであり、赤い色を表すビットだけが残ります。ビットを完全に下に移動したので、値は[0、255]の数値を表します。次に、&255(ここでは16進表記で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
そして、私たちにも青い価値があります。
それがそれを説明することを願っています!