为什么我们使用>>从RGB获取颜色值?

时间:2014-04-22 06:04:37

标签: java colors

我知道要使用

从rgb获取颜色值
b = rgb >> 0
g = rgb >> 8
r = rgb >> 16

有人可以解释为什么会这样吗?每个都是8位对吗?没有>>> n给出前n位?它对b和r的作用如何?

4 个答案:

答案 0 :(得分:2)

实际上,除非你在某个时候剥掉不需要的位,否则它不应该起作用。

>>是右移位运算符,其中零位从左侧进入,向右侧滚动的位被发送到bitbucket(被丢弃)。考虑到24位RGB值具有以下位,每种颜色八个):

rrrrrrrrggggggggbbbbbbbb

右移0位给出相同的值,右移8位给出rrrrrrrrgggggggg,右移16位给出rrrrrrrr

因此,您可以看到三个班次为您提供“低”(最右侧)八位中的三个颜色值。更常规的方法是and使用255(十六进制为0xff)来确保除了低八位之外的所有位都清零:

b = (rgb      ) & 0xff;
g = (rgb >>  8) & 0xff;
r = (rgb >> 16) & 0xff;

有关按位运算符的更详细说明,请参阅this answer

答案 1 :(得分:2)

是的,这些是"右转"运算符 - 因此,如果颜色编号以24位编码, 是红色的高8位,绿色的中间8位,蓝色的8位,如上所述可能有效。

例如,橙色编码为0xff8000;

做的:

rgb = 0xff8000;
b = rgb >> 0; // redundant, the ">>" operator shuld not have been used at all
g = rgb >> 8 ; // g contains ff80
r = rgb >> 16 ; //r contains ff

这里可能只对这些运算符起​​作用的是r,g和b变量被定义为8位无符号整数,其方式是高位(如上面的g)被截断。我不认为这是一个好习惯,因为它取决于具体的 语义和正确的变量类型只能保持8位无符号。以下变量使用按位AND运算符(&)显式过滤掉较高位,以便获得任何大小的r,g和b变量的颜色分量,并且应该是首选,因为它不会导致确切地说是引起你提出这个问题的疑问:

rgb = 0xff8000;
b = rgb & 0xff; 
g = (rgb >> 8) & 0xff ; // g contains 80
r = (rgb >> 16) & 0xff ; //r contains ff

答案 2 :(得分:1)

假设rgb为:0xFF55FF,二进制为:

11111111 01010101 11111111
^^^^^^^^ ^^^^^^^^ ^^^^^^^^
    r        g       b     -- rgb color parts (or components)

现在您的代码正在做的是通过向右移动来提取每个组件,我假设r,g,b属于unsigned char类型(否则它将无效):

b = rgb >> 0

这里没有必要移位,rgb vale被隐式地转换为unsigned char,只剩下11111111-b part。

g = rgb >> 8

这里,首先将b部分向右移动以使g部分位于其上,并且再次如上所述01010101二进制部分被分配给g,如果g是一个字节,则在赋值期间它被隐式地铸造(r部分被铸造掉) )并且g被赋予01010101二进制值。

r = rgb >> 16

这里的历史与g

的历史相同

答案 3 :(得分:0)

您应该添加以下类型:

int rgb = 0x1234FF;
byte b = rgb >> 0;
byte g = rgb >> 8;
byte r = rgb >> 16;

然后它会变得更清晰一些。 rgb的位移到右边,并且通过分配到第8位以外的所有byte都会被截断。