x & 0xfffffe 是什么意思?

What does x & 0xfffffe mean?

在自定义 YUV 到 RGBA Renderscript 中,我发现了以下我无法理解的行:

int baseUYIndex = numTotalPixels + (y >> 1) * wIn + (x & 0xfffffe);

剧本来自customYUVToRGBAConverter.

我之所以问,是因为我必须先了解转换。在下一步中,我想将 Y、U 和 V 组件旋转 90 度。我向 here 寻求帮助,但没有人能提供帮助。所以,我决定自己做。

查看 linked 代码中的注释,您可以看到此例程适用于一种特定类型的 YUV:具有色度子采样的 YUV。

// YUV 4:2:0 planar image, with 8 bit Y samples, followed by
// interleaved V/U plane with 8bit 2x2 subsampled chroma samples

这意味着 "color" (U/V) 个字节少于 "luminance" (Y) 个字节。具体来说,原图中一个由4个像素组成的正方形,只会被一个"U"和一个"V"覆盖。 (不过它会有 4 个 Y。)U 和 V 交错成一个单独的 "plane",它跟随 Y 平面。 Here 是一个 link,更详细地描述了相同的排列。

另请参阅维基媒体上的 this 图片(注意:linked 图片的图片格式略有不同,其中 U 和 V 没有交错)。

代码分析

有问题的代码采用原始图像的 (x,y) 坐标,并计算 U/V 分量的数组偏移量。 (Y 分量的数组偏移很简单;它只是 x + y * wIn)。每个U/V对对应原图中一个4像素的正方形;这意味着每个 U/V 对覆盖 2 个相邻行中的像素。

y >> 1

这条线有效地将 y 除以 2,这为 U/V 平面 提供了正确的行号 。乘以 wIn(这是图片的宽度),您就得到了 U/V 平面中与您的像素相对应的 U/V 行开头的字节偏移量。

x & 0xfffffe

这相当于x - (x % 2)。换句话说,我们正在使 x 均匀。这是为了计算 U/V 对的 U/V 行的偏移量。由于每个 U/V 都是一个双字节对,我们总是希望以该对的第一个元素结束:在本例中为 A "U"。

从这段代码可以看出,

uchar _u = rsGetElementAt_uchar(inputAllocation, baseUYIndex);
uchar _v = rsGetElementAt_uchar(inputAllocation, baseUYIndex + 1);

U来自计算偏移量处的字节; V,从下一个字节开始。

在那里,你有你的色度。