反转整数x中的位

时间:2011-09-19 08:08:20

标签: bit

位反转

我发现这个代码用于反转整数x中的位(假设为32位值):

unsigned int
reverse(register unsigned int x)
{
x = (((x & 0xaaaaaaaa) >> 1) | ((x & 0x55555555) << 1));
x = (((x & 0xcccccccc) >> 2) | ((x & 0x33333333) << 2));
x = (((x & 0xf0f0f0f0) >> 4) | ((x & 0x0f0f0f0f) << 4));
x = (((x & 0xff00ff00) >> 8) | ((x & 0x00ff00ff) << 8));
return((x >> 16) | (x << 16));
}

我无法理解此代码背后的逻辑/算法。所有神奇数字的目的是什么?

2 个答案:

答案 0 :(得分:6)

让我们看看它是如何为8位值完成的:

函数中的第一行占用每秒位并向左或向右移动:

12345678  -->  1-3-5-7-  -->  -1-3-5-7  -->  21436587
               -2-4-6-8       2-4-6-8-

第二行采用两位组并向左或向右移动:

21436587  -->  21--65--  -->  --21--65  -->  43218765
               --43--87       43--87--

第三行采用四位组并向左或向右移动:

43218765  -->  4321----  -->  ----4321  -->  87654321
               ----8765       8765----

现在这些位相反。对于32位值,您需要再执行两个步骤,以8和16为一组移动位。

答案 1 :(得分:1)

那是有点面具。以二进制形式编写它们并记住bitwise and的工作原理。你也可以拿一张纸,记下每一步的面具,输入和结果,然后将它排序。