使用按位进行位反转

时间:2010-03-25 13:09:23

标签: algorithm bit-manipulation

我试图在一个字节中进行位反转。我使用下面的代码

static int BitReversal(int n)
{
    int u0 = 0x55555555; // 01010101010101010101010101010101
    int u1 = 0x33333333; // 00110011001100110011001100110011
    int u2 = 0x0F0F0F0F; // 00001111000011110000111100001111
    int u3 = 0x00FF00FF; // 00000000111111110000000011111111
    int u4 = 0x0000FFFF;
    int x, y, z;
    x = n;
    y = (x >> 1) & u0;
    z = (x & u0) << 1;
    x = y | z;

    y = (x >> 2) & u1;
    z = (x & u1) << 2;
    x = y | z;

    y = (x >> 4) & u2;
    z = (x & u2) << 4;
    x = y | z;

    y = (x >> 8) & u3;
    z = (x & u3) << 8;
    x = y | z;

    y = (x >> 16) & u4;
    z = (x & u4) << 16;
    x = y | z;

    return x;
}

它可以反转该位(在32位机器上),但是有一个问题, 例如,输入是10001111101,我想得到10111110001,但是这个方法会反转整个字节,包括标题0s。输出为10111110001000000000000000000000。 有没有任何方法只能反转实际数字?我不想将其转换为字符串和反转器,然后再次转换。有没有纯数学方法或位操作方法?

最诚挚的问候,

5 个答案:

答案 0 :(得分:4)

使用类似方法获取最高位数,并将结果位移到右侧33 - #bits和瞧!

答案 1 :(得分:1)

俗气的方式是转移,直到你得到右边的1:

if (x != 0) {
    while ((x & 1) == 0) {
        x >>= 1;
    }
}

注意:您应该将所有变量切换为unsigned int。如上所述,只要您右转,就可以有不必要的符号扩展名。

答案 2 :(得分:0)

一种方法可能是找到数字n中的符号位的前导数,左移n乘以该数字,然后通过上述算法运行它。

答案 3 :(得分:0)

假设所有32位都是重要的并且反转整个事物。您可以尝试通过找到最高1来猜测有效位的数量,但这不一定准确,所以我建议您修改函数,这样它需要第二个参数来指示有效位的数量。然后在反转位之后将它们移到右边。

答案 4 :(得分:0)

尝试使用Integer.reverse(int x);

相关问题