"& 是什么意思? 0xff”做?
我试图理解下面的代码,其中 b
是给定的整数,image
是图像。
据我所知,如果给定点 i,j 的 RGB 值大于 b,则将该像素设置为白色,否则设置为黑色。所以会将图像转换为黑白图像。
然而我不知道 (& 0xff) 实际做了什么,我猜它是一种二进制移位?
if ((image.getRGB(i, j) & 0xff) > b) {
image.setRGB(i, j, 0xffffff) ;
} else {
image.setRGB(i, j, 0x000000);
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这就是所谓的面具。问题是,您可以将 RGB 值全部存储在一个整数中,每个分量对应一个字节。类似于 0xAARRGGBB(阿尔法、红色、绿色、蓝色)。通过使用 0xFF 执行按位与,您只保留最后一部分,即蓝色。对于其他通道,您可以使用:
在 alpha 情况下,您可以跳过
& 0xFF
,因为它不执行任何操作;蓝色情况下移位 0 也是如此。It's a so-called mask. The thing is, you get the RGB value all in one integer, with one byte for each component. Something like 0xAARRGGBB (alpha, red, green, blue). By performing a bitwise-and with 0xFF, you keep just the last part, which is blue. For other channels, you'd use:
In the alpha case, you can skip
& 0xFF
, because it doesn't do anything; same for shifting by 0 in the blue case.颜色表示
RGB 值是一个整数,因此它在内存中用 4 个字节(或等效的 32 位)表示。
示例:
每个字节代表颜色的一个组成部分:
0xff 和 0xffffff 符号
0xff 表示十六进制值 FF,等于整数 255。其二进制表示为:
同样 0xffffff 表示为:
它对应于颜色 白色(红、绿、蓝等于 255)。
&运算符
二元运算符和“&”应用于两个整数 i1 和 i2 (i1 & i2)。它返回一个整数,除了 i1 和 i2 中都等于 1 的位外,所有位都等于 0。
例如,如果我们应用 &在我的第一个示例和 0xff 上,我们得到:
因此, (& 0xff) 只能保留最后一个字节的值(即颜色的蓝色分量的值)。
Color representation
The RGB value is an integer so it is represented in memory by 4 bytes (or equivalently 32 bits).
Example:
Each byte represents one component of the color :
0xff and 0xffffff symbols
0xff represents the hexadecimal value FF which is equal to the integer 255. Its binary representation is:
Similarly 0xffffff is represented by:
It corresponds to the color white (red, green and blue equal to 255).
& operator
The binary operator and "&" is applied on two integers i1 and i2 (i1 & i2). It returns an integer with all its bits equal to 0 except the ones which are equal to 1 in both i1 and i2.
For example, if we apply & on my first example and on 0xff, we obtain:
As a consequence, (& 0xff) enables to only keep the values of the last byte (i.e., the value of the blue component of the color).
正在
获取颜色分量之一(红色或蓝色,我忘了是哪一个)。
如果不执行颜色遮罩,请考虑 RGB (0, 127, 0) 和阈值 63。 getRGB(...) 调用将返回
Which 明显大于阈值 63。但其目的是忽略其他两个颜色通道。位掩码仅获取最低 8 位,其中为零。
检查
颜色是否比特定阈值“b”更亮。
如果超过阈值,则将像素着色为白色,使用
...否则将其着色为黑色,使用...
因此,它是基于单个颜色通道上的简单逐像素阈值的黑白转换。
The
is getting one of the color components (either red or blue, I forget which).
If the color mask is not performed, consider RGB (0, 127, 0), and the threshold 63. The getRGB(...) call would return
Which is clearly more than the threshold 63. But the intent was to ignore the other two color channels. The bitmask gets only the lowest 8 bits, with is zero.
The
is checking if the color is brighter than a particular threshold, 'b'.
If the threshold is exceeded, the pixel is colored white, using
... otherwise it is colored black, using
So it is a conversion to black and white based on a simple pixel-by-pixel threshold on a single color channel.
这可能是因为与 ARGB 之间存在一些转换。 这是一篇非常好的博客文章 关于为什么要对颜色进行按位运算。
It is probably because there is some conversion to or from ARGB. This is a really good blog post about why to do bit-wise operations for colors.
<代码>& 0xff 是按位 AND
(image.getRGB(i,j)&0xff)
获取getRGB
返回的 rgb 编码 int 的蓝色值 <代码>> b 部分检查是否大于某个阈值& 0xff
is a bitwise AND(image.getRGB(i,j)&0xff)
gets the blue value of the rgb encoded int returned bygetRGB
the> b
part check whether it's larger than some threshold