当前位置: 代码迷 >> java >> 使用位运算符JAVA交换int [] []数组中每行/列的顶部和底部2位
  详细解决方案

使用位运算符JAVA交换int [] []数组中每行/列的顶部和底部2位

热度:24   发布时间:2023-07-25 20:05:15.0

我需要获取一些数组,并将每个[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(取决于之前的内容)。 他为底数做相反的操作,然后按位或对这两个数进行运算(他组合了上下数)。

编辑:在所有评论和交流之后,这是一个可行的解决方案:

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;
    }
}
  相关解决方案