位反转
我发现这个代码用于反转整数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));
}
Run Code Online (Sandbox Code Playgroud)
我无法理解此代码背后的逻辑/算法.所有神奇数字的目的是什么?
让我们看看它是如何为8位值完成的:
函数中的第一行占用每秒位并向左或向右移动:
12345678 --> 1-3-5-7- --> -1-3-5-7 --> 21436587
-2-4-6-8 2-4-6-8-
Run Code Online (Sandbox Code Playgroud)
第二行采用两位组并向左或向右移动:
21436587 --> 21--65-- --> --21--65 --> 43218765
--43--87 43--87--
Run Code Online (Sandbox Code Playgroud)
第三行采用四位组并向左或向右移动:
43218765 --> 4321---- --> ----4321 --> 87654321
----8765 8765----
Run Code Online (Sandbox Code Playgroud)
现在这些位是相反的.对于32位值,您需要再执行两个步骤,以8和16为一组移动位.
| 归档时间: |
|
| 查看次数: |
820 次 |
| 最近记录: |