4

I found this line of code: this.red = (float)(par4 >> 16 & 255) / 255.0F; where red has been declared as a float.

I am trying to understand what it does, especially because the full code is:

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);

so I'm guessing this somehow uses different locations of an int (par4) to color text. par4 is equal to 553648127 in this case.

What do those four lines mean, notably the >> 16 & 25?

4

4 回答 4

6

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

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

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

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

0000000000000000AAAAAAAARRRRRRRR

最后,以位表示的应用&255程序00000000000000000000000011111111将屏蔽最后 8 位:

  0000000000000000AAAAAAAARRRRRRRR
& 00000000000000000000000011111111
= 000000000000000000000000RRRRRRRR

这给了你红色字节。

于 2013-06-22T22:58:35.077 回答
4

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

b1000 >> 3 = b0001

您会看到它是如何正确移动这些位的。

&是按位与运算符。的结果x & y将是一个值,其中只有位在x并且y都在。

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.01告诉我们颜色有多“红”。

蓝色和绿色也是如此。

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

于 2013-06-22T23:01:57.623 回答
0

与 255 (0b11111111) 进行按位与运算会丢弃整数中除 8 个最低有效位之外的所有位。如果先右移,则可以从该整数的其他区域访问八位组。

于 2013-06-22T23:01:55.817 回答
0

par4似乎将具有 RGB 值和 alpha 的颜色定义为具有 4 个字节的整数。

>>因此,通过使用运算符将​​字节“较低”字节向右移动并用& 255. 之后,字节值通过/ 255.0f.

如果我们的整数中的 4 个字节类似于 AARRGGBB,其中 AA、RR、GG、BB 分别表示一个字节,并且您例如想要挑出红色,您首先使用 移开绿色和蓝色字节>> 16,这将留下您一个整数 0000AARR,然后用 屏蔽掉 alpha & 255,这将留下一个整数 00000000RR,其中 RR 现在是 1 个字节(2 个半字节),值介于 0 和 255 之间,最终转换为 0.0 之间的浮点数和 1.0 除以/ 255.0f.

于 2013-06-22T23:08:57.147 回答