什么(浮动)(par4>> 16& 255)/ 255.0F;意思?

时间:2013-06-22 22:55:50

标签: java hex bit-manipulation

我找到了这行代码:this.red = (float)(par4 >> 16 & 255) / 255.0F;其中red已被声明为float

我试图理解它的作用,特别是因为完整的代码是:

this.red = (float)(par4 >> 16 & 255) / 255.0F;
this.blue = (float)(par4 >> 8 & 255) / 255.0F;
this.green = (float)(par4 & 255) / 255.0F;
this.alpha = (float)(par4 >> 24 & 255) / 255.0F;
GL11.glColor4f(this.red, this.blue, this.green, this.alpha);

所以我猜这会以某种方式使用int(par4)的不同位置来着色文本。在这种情况下,par4等于553648127

这四行意味着什么,尤其是>> 16 & 25

4 个答案:

答案 0 :(得分:5)

带alpha通道的RGB(通常称为RGBA或aRGB)是四个字节打包成一个整数。

AAAAAAAARRRRRRRRBBBBBBBBGGGGGGGG   // the original par4, each char represents one bit.
                                   // where ARBG stands for alpha, red, blue and green bit.

shift和运算符用于检索每个字节。例如,par4 >> 16 & 255首先右移整数16位,使原始第3个字节位于基数,255作为掩码提取仅一个字节。

并且par4 >> 16将原始字节右移16位;

0000000000000000AAAAAAAARRRRRRRR

最后,在位表示中应用&255({1}}将掩盖最后8位:

00000000000000000000000011111111

这会给你红色字节。

答案 1 :(得分:4)

>>是右位移位运算符。这在二进制文件中更容易看到:

b1000 >> 3 = b0001

你看到它是如何移动的。

&是按位AND运算符。 x & y的结果将是一个值 xy中的位数。

b1  & b1  = b1
b1  & b0  = b0
b0  & b1  = b0
b11 & b01 = b01

所以

this.red = (float)(par4 >> 16 & 255) / 255.0F;

...从par4获取值并将位右移16位以将“红色”值移动到最右边的部分。然后它掩盖了除最右边的字节以外的任何东西。然后它将值{(必须在0255范围内,包括)除以255作为浮点数,从而得到0.0和{之间的浮点值{1}}告诉我们颜色是多么“红”。

同样适用于蓝色和绿色。

然后它使用相同的机制来确定alpha通道(透明度)的强度。

答案 2 :(得分:0)

使用255(0b11111111)的按位并去除除了8个最低有效位之外的整数中的所有位。如果先右移,则可以从该整数的其他区域访问8位组。

答案 3 :(得分:0)

par4似乎用RGB值定义颜色,alpha定义为4字节的整数。

因此,通过使用>>运算符将字节“较低”字节向右移位并使用& 255屏蔽“较高”字节来挑出4个字节。 然后通过/ 255.0f将字节值标准化为介于0.0和1.0之间的浮点值。

如果我们整数中的4个字节类似于AARRGGBB,其中AA,RR,GG,BB各自表示一个字节,例如,想要挑出红色,你首先用>> 16移走绿色和蓝色字节,这将留下一个整数0000AARR,然后用& 255掩盖alpha,这将离开你有一个整数00000000RR,其中RR现在是1字节(2个半字节),其值介于0和255之间,你最终通过除/ 255.0f转换为0.0到1.0之间的浮点数。