计算在图像位平面切片



寻找一些图像位平面切片的方法,我找到了以下函数。事件虽然我熟悉按位运算,但我不明白这行确切的代码:

if (((fcol >>> d) & 1) > 0) col = 0xffffff;

图像位平面切片方法:

private void transfrombit(int d) {
transform = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), BufferedImage.TYPE_INT_RGB);

for (int i = 0; i < originalImage.getWidth(); i++)
for (int j = 0; j < originalImage.getHeight(); j++) {
int col = 0;
int fcol = originalImage.getRGB(i, j);
if (((fcol >>> d) & 1) > 0) col = 0xffffff;
transform.setRGB(i, j, col);
}
}

有人可以解释一下上述方法中的计算是如何工作的吗?

((fcol >>> d) & 1) > 0

是一种测试位d是否在fcol中设置的方法,这是(fcol & (1 << d)) != 0的替代方案,除了它在d == 31时不起作用(但这在这种情况下d in [0 .. 23]所以这无关紧要)。((fcol >>> d) & 1) != 0也会让它对d = 31起作用。

顺便说一下,另一种形式((fcol & (1 << d)) != 0)在这种情况下具有潜在的优势,1 << d因为它是循环不变的(并且可以由JIT编译器从循环中移除),因此测试可能会编译为比第一种形式更少的指令,其中每个像素的偏移是不可避免的。

在此上下文中,此逻辑用于测试每个像素的位d,并为设置了该位的像素创建具有0xffffff的位图,否则为 0。

最新更新