位反转
这里的位反转(Bit Reversal),指的是一个数的所有bit位依照中点对换位置,例如0b0101 0111 => 0b1110 1010。也可以叫二进制逆序,按位逆序,位翻转等等。
算法说明
该算法用于将8bit数通过查表的方式进行位反转。算法采用半字节查表法,与一般的查表法相比,减少了空间的占用。
位反转算法代码
unsigned char reverse_table[] =
{
0x0, 0x8, 0x4, 0xC, 0x2, 0xA, 0x6, 0xE,
0x1, 0x9, 0x5, 0xD, 0x3, 0xB, 0x7, 0xF
};
unsigned char reverse(unsigned char x)
{
x = reverse_table[ x & 0x0F] << 4 |
reverse_table[ x >> 4 & 0x0F];
return x;
}
算法计算过程
计算分为三个步骤
1.reverse_table[ x & 0x0F] << 4
通过x & 0x0F
得到低4位数
通过查表获取x的低4位的反转值
将低4位左移4位成为高4位
得到一个高4位的数值
2.reverse_table[ x >> 4 & 0x0F]
接下来操作x的高4位
将高4位右移成为低4位
通过查表获取x的低4位的反转值
3.将步骤1和2获取的数值进行或操作,得到结果
拓展
可以使用该位反转算法实现32位数的位反转。
代码如下:
unsigned char reverse_table[] =
{
0x0, 0x8, 0x4, 0xC, 0x2, 0xA, 0x6, 0xE,
0x1, 0x9, 0x5, 0xD, 0x3, 0xB, 0x7, 0xF
};
unsigned int reverse(unsigned int x)
{
x = ((reverse_table_16[(x >> 4) & 0x0F] | reverse_table_16[(x ) & 0x0F] << 4) << 24) |
((reverse_table_16[(x >> 12) & 0x0F] | reverse_table_16[(x >> 8) & 0x0F] << 4) << 16) |
((reverse_table_16[(x >> 20) & 0x0F] | reverse_table_16[(x >> 16) & 0x0F] << 4) << 8) |
(reverse_table_16[(x >> 28) & 0x0F] | reverse_table_16[(x >> 24) & 0x0F] << 4);
return x;
}
[参考资料]
Bit Twiddling Hacks
位反转算法 查表法
[Hacker’s Delight] 作者: Henry S. Warren Jr.