我找到了这行代码: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
?
答案 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
的结果将是一个值仅 x
和y
中的位数。
b1 & b1 = b1
b1 & b0 = b0
b0 & b1 = b0
b11 & b01 = b01
所以
this.red = (float)(par4 >> 16 & 255) / 255.0F;
...从par4
获取值并将位右移16位以将“红色”值移动到最右边的部分。然后它掩盖了除最右边的字节以外的任何东西。然后它将值{(必须在0
到255
范围内,包括)除以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之间的浮点数。