0xFFCC66のような16進数カラーコードからRGB値をばらばらに取得したい場合は、右方向へのビットシフトの後、必要な桁以外にビットマスクをかけて除外すればよい。
6桁の16進数コードを2桁ずつに分解すれば上から順にR、G、Bの値が取れる。16進数は1桁あたり4bitなので、2桁シフトするには8bitシフトすればいい。Rなら16bit右にビットシフトする。Bはもともと下2桁にあるのでビットシフトする必要はない。
0xFFCC66 >> 8 ;->0x00FFCC
下2桁に取得したい値があるので、後は上位の桁をビットマスクで除外する。0xFFとのビット積を求めればいい。
0x00FFCC & 0xFF ;->0x0000CC
百聞は一見にしかず。
LOCAL = 0xFFCC66 ;Rを取得 16bitシフトしてからマスク R = LOCAL >> 16 & 0xFF ;Gを取得 8bitシフトしてからマスク G = LOCAL >> 8 & 0xFF ;Bを取得 最初から下二桁にあるので上位をマスクするだけでいい B = LOCAL & 0xFF PRINTFORM %TOSTR(R, "X2")%, PRINTFORM %TOSTR(G, "X2")%, PRINTFORM %TOSTR(B, "X2")% ;-> 0xFF, 0xCC, 0x66
逆にRGBそれぞれの値から16進カラーコードを取得するにはどうすればいいだろうか。
そういうときは、上で行ったのとは逆の計算をすればいい。つまり、逆方向にシフトした後、各値のビット和を求めるわけだ。
R = 255 G = 143 B = 95 LOCAL = R << 16 | G << 8 | B PRINTFORM %TOSTR(LOCAL, "X2")% ;->0xFF8F5F
ビット演算は理解しにくい部分もあるが、ある種のイディオムとして覚えてしまうというのもひとつの手で、上記のコードもそういう類のものだろう。もちろん理解しておいて損はないが、その取っ掛かりとして、たとえば「0xFFとのビット積を求めるとどうして下位8ビットが取得できるのか」ということからはじめてみてもいいと思う。下位8ビットを取得して何がうれしいのかは、今回の例が示しているわけだし。
コメントをかく