使用位操作符为int[][]数组中的每行/col交换顶部和底部2位



我需要取一些数组,并为每个[row][col]交换底部2位和顶部2位,我很迷路。我在这里发现了一个类似的线程,这段代码:

for (int row = 0; row < height; row++) {
    for (int col = 0; col < width; col++) {
        int pic = image[row][col];
        int top  = (pic & 0b11110000) >> 2;
        int bottom = (pic & 0b00001111) << 2;
        pic = top | bottom;
        image[row][col] = pic;
    }
}

,它似乎可以工作,但不完全正确。另外,我完全不理解这部分:0b00001111。

我发现这里的代码,线程似乎是完全相同的问题,我正在....上工作比如包括其他代码。我得到的指示是:

"调用swap可以通过交换底部2位和顶部2位来恢复每个像素被打乱的图像。要做到这一点,需要代码执行相同的交换以恢复映像。注意:一个像素的最大值(Picture.MAXVAL)是255,所以每个像素只有8位有效。它们被编号为0-7位,其中0位等于1,7位等于128。不允许有负值。"

我想这就是你想要的,看起来你把比特和字节混淆了。整数为4字节,即32位。

for (int row = 0; row < height; row++) {
    for (int col = 0; col < width; col++) {
        int mask = 0b11111111_11111111_00000000_00000000;
        int pic = image[row][col];
        int top  = (pic & mask ) >> 16;
        int bottom = (pic & ~mask) << 16;
        pic = top | bottom;
        image[row][col] = pic;
    }
}

如果你真的想用底部

交换顶部的2位
for (int row = 0; row < height; row++) {
    for (int col = 0; col < width; col++) {
        int maskTop = 0b11000000_00000000_00000000_00000000;
        int maskBottom = 0b00000000_00000000_00000000_00000011;
        int pic = image[row][col];
        int top  = (pic & maskTop) >> 30;
        int bottom = (pic & maskBottom) << 30;
        pic = top | bottom | (image[row][col]&~(maskTop+maskBottom));
        image[row][col] = pic;
    }
}

我还没有测试过这两个,但它们看起来是正确的。

既然Robadob已经回答了,我将为你澄清一些问题:

在Java中,可以这样写数字:

  • 十进制方式(int x = 26 =>十进制26),
  • 十六进制方式(int x = 0x1A =>十进制26),
  • 二进制方式(int x = 0b11010 =>十进制26)

当像您的示例那样操作位和字节时,有时使用0b...符号为位操作编写位掩码是非常有用的。同样,请参阅Robadob的回答。

当他这样做:int top = (pic & mask ) >> 16;时,这意味着他取了pic整数的所有位,并按位执行 (&)。然后向右移动16位(int有32位)。因此,顶部16位都被设置为0,底部16位被设置为1或0(取决于之前的位置)。他对bottom做了相反的操作,然后对这两个数字按位操作(他将top和bottom组合在一起)。

编辑:经过所有的评论和沟通,这是一个有效的解决方案:

for (int row = 0; row < height; row++) {
    for (int col = 0; col < width; col++) {
        byte maskTop = 0b11000000;
        byte maskBottom = 0b00000011;
        byte pic = image[row][col];
        byte top  = (pic & maskTop) >> 6;
        byte bottom = (pic & maskBottom) << 6;
        pic = top | bottom | (image[row][col] & ~(maskTop+maskBottom));
        image[row][col] = pic;
    }
}

相关内容

  • 没有找到相关文章

最新更新