在Bitwise运算符中的澄清

时间:2014-08-01 16:02:19

标签: java bitwise-operators

我正在尝试读取图像并根据其RGBA值打印特定颜色名称(始终保持Alpha值不变)。这可以通过非常复杂的方式实现,但我在互联网上遇到了这个功能工作得很好,但我无法理解这是如何工作的,因为我熟悉只有按位运算符操作2个操作数。

这是代码

public block(int r, int g, int b)
{
 color = r << 24 | g << 16 | b << 8 | 0xff
}

有些人可以向我解释一下,只有我能理解的是0xff十六进制是十进制的255并且正在发生按位OR。

谢谢

2 个答案:

答案 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位模式)并将它们打包到正确的字节位置。