对RGB值使用逻辑bitshift

Ale*_*lex 4 actionscript bit-manipulation colors bit-shift

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

var color:uint = myObject.color;
var red:uint = color >>> 16;
var green:uint = color >>> 8 & 0xFF;
var blue:uint = color & 0xFF;
Run Code Online (Sandbox Code Playgroud)

我想知道`&0xFF'对绿色和蓝色到底是做什么的.我理解AND操作的作用,但为什么需要(或者好主意)呢?

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

欣赏提示.亚历克斯

San*_*dri 13

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

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

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

这是发生的事情:

var color:uint = myObject.color;
Run Code Online (Sandbox Code Playgroud)

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

var red:uint = color >>> 16;
Run Code Online (Sandbox Code Playgroud)

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

但对于:

var green:uint = color >>> 8 & 0xFF;
Run Code Online (Sandbox Code Playgroud)

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