我需要取一些数组,并为每个[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;
}
}