我正在尝试读取图像并根据其RGBA值打印特定颜色名称(始终保持Alpha值不变)。这可以通过非常复杂的方式实现,但我在互联网上遇到了这个功能工作得很好,但我无法理解这是如何工作的,因为我熟悉只有按位运算符操作2个操作数。
这是代码
public block(int r, int g, int b)
{
color = r << 24 | g << 16 | b << 8 | 0xff
}
有些人可以向我解释一下,只有我能理解的是0xff十六进制是十进制的255并且正在发生按位OR。
谢谢
答案 0 :(得分:5)
<<
运算符是bit-wise shift。下表可以帮助您获得要点:
x << y -> base 2 == base 10 explanation
1 0 1 1 multiply by 2^0 = x1 = shift 0 times
1 1 10 2 multiply by 2^1 = x2 = shift 1 time
1 2 100 4 multiply by 2^2 = x4 = shift 2 times
1 3 1000 8 multiply by 2^3 = x8 = shift 3 times
3 1 110 6 multiply by 2^1 = x2 = shift 1 time
5 2 10100 10 multiply by 2^2 = x4 = shift 2 times
所以,如果你有数字R,G和B都适合8位,并且你写了它们的位,你就是这样做
rrrrrrrr 00000000 00000000 00000000 // R << 24: added 24 zeroes
+ gggggggg 00000000 00000000 // G << 16: added 16 zeroes
+ bbbbbbbb 00000000 // B << 8: added 8 zeroes
+ 11111111 // 0xff for "fully opaque"
---------------------------------------
rrrrrrrr gggggggg bbbbbbbb 11111111 // RGBA8, a 32-bit int
其中“+”相当于按位“或”,当没有进位并且为了清晰起见而使用
正如Alcanzar所说,你必须非常确定R,G和B都适合8位(并且由于内部表示,负数的最高位,称为“符号位”,设置)。想象一下,B实际上大于255 - 使用该公式,其“高”位会弄乱结果的G和/或R分量。如果您不信任您的输入,您可以使用类似
的内容清理每个组件(R,G和B)x &= 0xff; // guarantees that only the lowest 8 bits of 'x' can be set
答案 1 :(得分:4)
<<
是按位移位操作。那么代码正在做的是创建一个压缩的RGBA值,它包含R的第一个字节,G的第二个字节,B的第三个字节和一个常量255 A值。
(24位= 3字节,16位= 2字节,8 = 1字节)
如果这个代码传递了一个负r / g / b值,它也会做错事。它可能更清楚/更正确地写为:
((r&amp; 0xff)&lt;&lt; 24)| ((g&amp; 0xff)&lt;&lt; 16)| ((b&amp; 0xff)&lt;&lt; 8)| 0xff的
也就是说确保我们只查看r / g / b的底部8位(0xff是一个全1,8位模式)并将它们打包到正确的字节位置。