从RGB图像中分离RGB通道时,&0xff的意义是什么?

3
我有以下代码片段。
for(int row=0; row<r; row++)
{
    for(int col=0; col<c; col++)
    {
        alphaPixels[row][col] = ((RGBarray[ii]>>24)&0xff);
        redPixels[row][col] = ((RGBarray[ii]>>16)&0xff);
        greenPixels[row][col] = ((RGBarray[ii]>>8)&0xff);
        bluePixels[row][col] = (RGBarray[ii]&0xff);
        ii++;
    }
}

为什么我们在位移操作后需要使用按位与运算符& 0xff

1
我们可以假设RGBarray是一个byte[]数组吗?如果您发布代码片段,请确保其中的所有内容都已正确指定给读者。 - Gimby
@Gimby:做一个有根据的猜测。如果它不是intlong数组,那么这段代码就没有意义了,而且由于int经常用于颜色,你可以假设它是一个int[]数组。 - fabian
@Fabian:Gimby可能是指alpha/red/green/bluePixels数组。 - user1196549
如果目标数组是字节,则使用0xff进行掩码处理是无用的。 - user1196549
2个回答

2
为什么我们需要在移位操作后使用按位与运算符'& 0xff'? 0xff是十六进制数,等于十进制的255。
在你的情况下,& 0xff确保所有像素值的范围在0到255之间(即正8位)。例如,如果任何值大于255,则会将其截断为0-255。
    int value=257;
    int result = value & 0xff; // result will be 1

所以,它的工作原理类似于正值的余数运算符%。但是按位运算符&比取余运算符%更快。

    int result = value % 256; //You will get same result for positive value 

1
int result = value % 256; // 您将获得相同的结果,但不适用于负值。由于移位不是无符号移位运算符,因此每个颜色通道都可能出现负值。 - fabian
@fabian,你是正确的。对于负值,它不会给出相同的结果。 - Masudul

1

0xff 的整数值为255。

>> n 将数字 n 向右移动指定的位数,& 运算符执行按位 AND 操作。

因此,& 0xff 掩码变量。它仅保留最后 8 位中的值,并忽略所有其他位。

这是一种常见的技巧,当您尝试将颜色值从特殊格式转换为标准 RGB 值时使用(因为它具有8位)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接