按位分离? (改变整数格式)

时间:2011-05-01 20:38:21

标签: java colors bit-manipulation

我正在使用Java。我有一个整数:

  

第24-31位是阿尔法,16-23是红色,   8-15为绿色,0-7为蓝色。

我想将其更改为int:

  

5-7位为红色,2-4为绿色,0-1为蓝色。

我不确定如何最好地解决这个问题。 (显然,一些可表示颜色的保真度会丢失。这是可以接受的,只要它是相称的,所以颜色看起来大致相同。)

我可以分开吗?

3 个答案:

答案 0 :(得分:3)

我建议你

int argb =
// extract the colours. 
int red = (argb >> 16) & 0xFF;
int green = (argb >> 8) & 0xFF;
int blue = argb & 0xFF;

// reduce the number of bits.
red >>= 5;
green >>= 5;
blue >>= 6;

// build the new value
int rgb2 = (red << 5) + (green << 2) + blue;

答案 1 :(得分:1)

没有。你需要做位移和掩蔽。

例如,要获得红色,您需要3位。所以你需要抓住第23,22和21位的最重要的红色位。

所以

int red = ((color >> 21) & 0x07); // gets the top 3 bits of the src red, and put in bottom of int
int newColor = red << 4; // shift back up to the new color

您必须为每个组件执行此操作,或者将(|)值添加到新颜色

答案 2 :(得分:0)

对于每个组件,移位并屏蔽掉最低有效位。

从长远来看,如果col是您的原始颜色,那么:

r = (col >> 21) & 0x07; // bits 21 - 23
g = (col >> 13) & 0x07; // bits 13 - 15
b = (col >>  6) & 0x03; // bits  6 -  7

,您的新值是:

(r << 5) | (g << 2) | b

或者,将它全部滚动到一个表达式中:

rgb = (col & 0xe00000) >> 16 | (col & 0xe000) >> 11 | (col & 0xc0) >> 6;