16進数のRGBの各チャンネルの値を取り出す
16進数のRGB値(たとえばこういうの→0xffcc33)から、RGBの各チャンネルを分解して取り出したいときがたまーにあるんですが、すぐ忘れちゃうのでメモっておきます
やり方はビット演算子をつかいます
c = 0xffcc33; red = c>>16; green = ( c& 0x00ff00 ) >>8; blue = c& 0xff;
まずRチャンネルは16ビット右にシフトします。これだけ。
これで右にはみ出た分は切り捨てられるので先頭の8ビットが取り出せます。
次にGチャンネルは0x00ff00とAND&演算します。
AND(&)とは、2つの数値を32ビットの2進数に変換して各ビット比較して両方とも1だったら1、それ以外は0にする演算です。
数値X : 0xffcc33 → 111111111100110000110011
数値Y : 0x00ff00 → 000000001111111100000000
↓↓↓
結果Z : 0x00cc00 → 000000001100110000000000
という具合にYのビットを0にするとZは少なくとも0になり、1にするとXのと同じになります。
つまりある範囲をトリミングしたいときはその範囲のビットをすべて1、それ以外を0にした32ビットの数字とAND演算すればよいことになります。
このCの値を8ビット右にシフトするとG値だけ取り出せます。
のこりのB値も同じです。こちらは右の末尾8ビットなのでシフトする必要はありません。
わかりにくときは、0xffをアンド演算するとスルー、0x00をアンド演算するとカットするフィルタみたいなイメージだと(用途にもよりますが)飲みこみやすいと思います。