我需要获取一些数组,然后将每个[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;
    }
}


我没有测试过任何一个,但是它们看起来不错。

08-06 12:31