Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 使用位反转_Algorithm_Bit Manipulation - Fatal编程技术网

Algorithm 使用位反转

Algorithm 使用位反转,algorithm,bit-manipulation,Algorithm,Bit Manipulation,我试图在一个字节中进行位反转。我使用下面的代码 static int BitReversal(int n) { int u0 = 0x55555555; // 01010101010101010101010101010101 int u1 = 0x33333333; // 00110011001100110011001100110011 int u2 = 0x0F0F0F0F; // 00001111000011110000111100001111 int u3

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

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;
}
静态int位反转(int n)
{
int u0=0x555555;//01010101010101010101010101
int u1=0x33333333;//001100110011
int u2=0x0F0F0F0F;//00001111001110000111100111
int u3=0x00FF00FF;//00000000 11111111 00000000 11111111
int u4=0x0000FFFF;
int x,y,z;
x=n;
y=(x>>1)和u0;
z=(x&u0)>2)和u1;
z=(x&u1)>4)和u2;
z=(x&u2)>8)和u3;
z=(x&u3)>16)和u4;

z=(x&u4)使用类似的方法获得最高位数,并将结果位向右移动33位,瞧!

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

俗气的方法是移动,直到在右边得到1:

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

注意:您应该将所有变量切换到
unsigned int
。如前所述,您可以在右移的任何时候使用不需要的符号扩展。

假设所有32位都是有效的,并将整个过程颠倒过来。您可以尝试通过找到最高的1来猜测有效位的数量,但这并不一定准确因此,我建议您修改该函数,使其使用第二个参数指示有效位的数量。然后在反转位后,将其向右移动。

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

a尽管我理解您的方法:它无法编译,因为您使用的是u4,并且没有在示例中定义它。添加int u4=0x0000FFFF;这不是原因,我只是忽略了这一点。“我正在尝试在一个字节中进行位反转”然后使用一个大小为16的映射。没有什么能比得上它的速度。你应该检查插入的值是否为零,因为你可能会得到一个无限循环。并且要注意符号位在有符号右移上的作用,它是实现定义的。可能正确的做法是提问者的代码切换到使用无符号int:没有理由f这是错误的:1000(高位3)变成@Ritsaert:1000有24个前导符号位,所以你将其移位24,而不是3