使用位运算符JAVA为int[][]数组中的每行/每列交换上下2位

使用位运算符JAVA为int[][]数组中的每行/每列交换上下2位,java,multidimensional-array,bitwise-operators,Java,Multidimensional Array,Bitwise Operators,我需要取一些数组,并将每个[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;

我需要取一些数组,并将每个[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;
    }
}
for(int row=0;row>2;

int bottom=(pic&0b0001111)我想这就是你想要的,看起来你把位和字节混在一起了。一个整数是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;
    }
}
for(int row=0;row>16;
int-bottom=(pic&~mask)>30;

int bottom=(pic&maskBottom)既然Robadob已经回答了,我将为您澄清一些问题:

在Java中,您可以将数字写入:

  • 十进制方式(
    int x=26
    =>decimal 26)
  • 十六进制方式(
    intx=0x1A
    =>十进制26)
  • 二进制方式(
    intx=0b11010
    =>十进制26)
在像您的示例中那样操作位和字节时,有时使用
0b…
符号为位操作编写位掩码非常有用。再次,请参阅Robadob的答案

当他这样做时:
inttop=(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;
    }
}
for(int row=0;row>6;

byte bottom=(pic和maskBottom)图像的类型是什么?我不完全理解你的问题。你能举个例子吗?
0b0001111
一个部分执行二进制和(注意,它是一个单一的,而不是两个,与pic相反),0b前缀似乎是Java 7中用于写入二进制文件的一项新功能。因此,它似乎是您交换底部和顶部的4位(半字节),而不是简单地交换最低有效字节的2位(整数是4字节,而不是1).阅读您的问题,您是否误解了位和字节?因为听起来您希望交换构成int的4个字节。对,我理解,但如果我只需要该字节的前两位,我会使用int foo=(x&0b11000000)@lexlcon int是4个字节,而不是1个字节。@lexIcon No…你需要0b11…然后是30个零。
int
有4个字节=32位。但是你还需要将连接的顶部和底部与内部28位合并在一起(Robadob回答的这部分:
|(image[row][col col and~(maskTop+maskBottom));
)是的,我明白了。我用我刚刚发现的一些相关说明更新了我的op:“一个像素(Picture.MAXVAL)的最大值是255,所以每个像素只有8位有效。”然后最好使用
byte
作为您的类型,而不是
int
。然后使用Robadob的解决方案(只需将位掩码修改为8位并更改移位)(>>30和>6,好的,显然对于这个特定的程序,只有前8(0-7)是相关的。所以我会做int-maskTop=0b11000000;int-maskBottom=0b000011;int-top=(pic&maskTop)>>7;int-bottom=(pic&maskBottom)工作!非常感谢。
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;
    }
}