【问题标题】:What does "& 0xff" do?“& 0xff”有什么作用?
【发布时间】:2011-05-25 14:54:09
【问题描述】:

我试图理解下面的代码,其中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);
}

【问题讨论】:

    标签: java bufferedimage


    【解决方案1】:

    这就是所谓的面具。问题是,您可以将 RGB 值全部放在一个整数中,每个分量一个字节。像 0xAARRGGBB (阿尔法,红色,绿色,蓝色)。通过使用 0xFF 执行按位与运算,您只保留最后一部分,即蓝色。对于其他渠道,您可以使用:

    int alpha = (rgb >>> 24) & 0xFF;
    int red   = (rgb >>> 16) & 0xFF;
    int green = (rgb >>>  8) & 0xFF;
    int blue  = (rgb >>>  0) & 0xFF;
    

    在 alpha 的情况下,你可以跳过& 0xFF,因为它什么都不做;在蓝色的情况下移动 0 也是一样的。

    【讨论】:

    • 太好了,我明白你的意思,还有其他方法可以获得相同的值吗?我还有其他示例,例如: blue = ( rgb & 0 x f f ) ;绿色 = ( RGB & 0 x f f0 0 ) >> 8;红色 = ( RGB & 0xf f0000 ) >> 16;或蓝色 = (rgb & 0xff);绿色 = ( RGB & 0 xf800 );红色 = ( RGB & 0xf80000 );
    • 当然,您可以先使用掩码,然后再使用移位,同样的事情会发生 - 掩码确保所有其他位为零,移位移动值使其位于整数的最右边字节中,因此在 0-255 范围内.. 另一方面,0xF8 只会保留 8 位的最高 5 位,所以我不确定你会在哪里发现它有用..
    • 例如 int red = (rgb >>> 16) & 0xFF; 的答案仍需要左移 16 位才能用作红色值。否则,它将看起来像蓝色的0x00000023
    • 所以,写int red = rgb & (0xFF << 16) 似乎更清晰。
    • @mcgyver5 - rgb & (0xFF << 16)rgb & 0xFF0000 相同,具有将红色与颜色隔离的效果(即将绿色和蓝色通道设置为 0)。如果这是您需要的,可能会很有用,但它不会为您提供通常更容易操作的正常范围 0..255 内的值。当然,如果您在开始时将位向右移动,那么您需要在完成后将它们向左移动到原来的位置,就像您说的那样。
    【解决方案2】:

    & 0xFF
    

    正在获取颜色组件之一(红色或蓝色,我忘记了)。

    如果不执行颜色掩码,请考虑 RGB (0, 127, 0) 和阈值 63。getRGB(...) 调用将返回

    (0 * 256 * 256) + (127 * 256) + 0 = 32512
    

    这显然超过了阈值 63。但其目的是忽略其他两个颜色通道。位掩码仅获取最低 8 位,为零。

    > b
    

    正在检查颜色是否比特定阈值“b”亮。

    如果超过阈值,则像素为白色,使用

    image.setRGB(i,j,0xffffff)
    

    ...否则它是黑色的,使用

    image.setRGB(i,j,0x000000)
    

    因此,它是基于单个颜色通道上的简单逐像素阈值的黑白转换。

    【讨论】:

    • 更新了解释位掩码的答案
    【解决方案3】:

    颜色表现

    RGB 值是一个整数,因此它在内存中用 4 个字节(或等效的 32 位)表示。

    例子:

    00000001 00000010 00000011 00000100
    

    每个字节代表颜色的一个组成部分:

    • 第一个字节:alpha 值(示例中为 00000001),对应不透明度
    • 第二个字节:红色值(示例中为00000010)
    • 第三个字节:绿色值(本例中为00000011)
    • 第4个字节:蓝色值(示例中为00000100)

    0xff 和 0xffffff 符号

    0xff代表十六进制值FF,等于整数255。其二进制表示为:

    00000000 00000000 00000000 11111111
    

    同样0xffffff表示为:

    00000000 11111111 11111111 11111111
    

    对应颜色为白色(红绿蓝等于255)。

    &运算符

    二元运算符和“&”应用于两个整数 i1 和 i2 (i1 & i2)。它返回一个整数,除了 i1 和 i2 中的位都等于 1 之外,它的所有位都等于 0。 例如,如果我们在我的第一个示例和 0xff 上应用 &,我们得到:

    00000000 00000000 00000000 00000100
    

    因此,(& 0xff) 可以只保留最后一个字节的值(即颜色的蓝色分量的值)。

    // If the blue component of image.getRGB(i, j) is greater than b
    if ((image.getRGB(i, j) & 0xff) > b) {
        // Set the image to white
        image.setRGB(i, j, 0xffffff) ;
    } else {
        // Set the image to black
        image.setRGB(i, j, 0x000000);
    }
    

    【讨论】:

      【解决方案4】:

      这可能是因为与 ARGB 进行了一些转换。 This is a really good blog post 为什么要对颜色进行按位运算。

      【讨论】:

      • 非常有用的链接。此链接清除了有关按位运算的更多概念.... :)
      【解决方案5】:

      & 0xff 是按位与

      (image.getRGB(i,j)&0xff) 获取getRGB 返回的 rgb 编码 int 的蓝色值,> b 部分检查它是否大于某个阈值

      【讨论】:

        猜你喜欢
        • 2012-07-07
        • 1970-01-01
        • 2015-04-28
        • 1970-01-01
        • 1970-01-01
        • 2018-07-06
        • 2013-08-15
        • 2016-05-24
        • 1970-01-01
        相关资源
        最近更新 更多