在Bitwise运算符中的澄清

Abh*_*k M 2 java bitwise-operators

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

这是代码

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

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

谢谢

tuc*_*uxi 5

<<运营商是一个逐位位移.下表可以帮助您获得要点:

 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
Run Code Online (Sandbox Code Playgroud)

所以,如果你有数字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
Run Code Online (Sandbox Code Playgroud)

其中"+"相当于按位"或",当没有进位时使用并且为了清楚起见而使用

正如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
Run Code Online (Sandbox Code Playgroud)