对RGB值使用逻辑bitshift

时间:2011-04-22 02:20:05

标签: actionscript colors bit-manipulation bit-shift

当谈到按位逻辑时,我有点天真,我有一个简单的问题...基本上如果我有这个(是ActionScript但可以应用于多种语言):

var color:uint = myObject.color;
var red:uint = color >>> 16;
var green:uint = color >>> 8 & 0xFF;
var blue:uint = color & 0xFF;

我想知道究竟是什么`& 0xFF'正在绿色和蓝色。我理解AND操作的作用,但为什么需要(或者好主意)呢?

此代码的来源位于:http://alexgblog.com/?p=680

欣赏提示。 亚历

1 个答案:

答案 0 :(得分:13)

在RGB中,红色为8位,绿色为8位,蓝色为8位。您将3个字节存储在一个int中,以这种方式有4个字节:

  • 蓝色的0-7(最不重要)位。
  • 绿色的比例为8-15(最不重要)。
  • 红色的比例为16-23(最不重要)。

要将它们提取为单独的值,您需要右移正确的位数,以便将与要提取的颜色对应的字节放在int的最低有效字节中,然后将其余的int放入在0中,以便只允许该字节值。最后一部分是通过使用掩码0xFF的AND操作完成的。 AND保留int的唯一字节,其中应用了相同的值,其余字节保留为0。

这就是:

var color:uint = myObject.color;

你有这样的颜色变量:0x00RRGGBB

var red:uint = color >>> 16;

右移16位颜色导致:0x000000RR,导致红色值。

但是:

var green:uint = color >>> 8 & 0xFF;

右移8位后,它会留下这个结果0x0000RRGG,但是这里我们只需要留下GG位,所以我们用掩码0xFF应用AND运算,或者更清楚0x000000FF,因为你知道并且离开旧的掩码为1且位为零的位值掩码为0,因此执行0x0000RRGG & 0x000000FF = 0x000000GG的结果为绿色值。同样适用于提取蓝色值。