使用位运算符 JAVA 交换 int[][] 数组中每个 row/col 的顶部和底部 2 位
Swap top and bottom 2 bits for each row/col in an int[][] Array using bit operators JAVA
我需要获取一些数组并将每个 [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。
我发现代码 here,该线程似乎与我正在处理的问题完全相同....就像包括其他代码一样。我得到的指示是:
"调用 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;
}
}
我需要获取一些数组并将每个 [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。
我发现代码 here,该线程似乎与我正在处理的问题完全相同....就像包括其他代码一样。我得到的指示是:
"调用 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;
}
}