gpt4 book ai didi

java - 按位运算符的澄清

转载 作者:行者123 更新时间:2023-12-02 10:50:28 26 4
gpt4 key购买 nike

我正在尝试读取图像并打印相对于其 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com