java - 按位运算符的澄清

标签 java bitwise-operators

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

这是代码

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

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

谢谢

最佳答案

<<运算符是 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

关于java - 按位运算符的澄清,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25084252/

相关文章:

java - android,如何在绘制后将颜色填充到形状中

java - 在 Ubuntu 上安装 Oracle Java

java - 编写一个递归方法,返回 'A' 在传递的字符串中出现的次数

java - 删除字节的最后一位

c - 用按位运算符编写的这个条件到底有什么作用?

java - 通过它连接 Java 到 MySQL 需要代理、用户名和密码

java - 如何查找文件中调用次数最多的时间段

c - 如何以二进制形式表示地址 0x80 到 1<<31

c - 这个按位 AND 运算符如何屏蔽数字的低七位?

javascript - 按位 AND OR 和 XOR 如何处理 -negative 有符号整数?