4

可能重复:
无符号整数中的 C 反转位

如何仅使用二进制运算符反转二进制数?

例如:

11100000 -> 00000111
00110100 -> 00101100
00111111 -> 11111100
4

3 回答 3

11

对于这类事情,我建议您查看很棒的页面Bit Twiddling Hacks

这只是从该页面获取的一个示例解决方案:

使用 3 次操作(64 位乘法和模除法)反转字节中的位

unsigned char b; // reverse this (8-bit) byte 
b = (b * 0x0202020202ULL & 0x010884422010ULL) % 1023;

正如评论中所指出的,这是另一种选择:

在 5 * lg(N) 次操作中并行反转 N 位数量

unsigned int v; // 32-bit word to reverse bit order

// swap odd and even bits
v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1);
// swap consecutive pairs
v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2);
// swap nibbles ... 
v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4);
// swap bytes
v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8);
// swap 2-byte long pairs
v = ( v >> 16             ) | ( v               << 16);
于 2012-10-15T20:24:36.817 回答
3

看看Bit Twiddling Hacks。有一整节是关于反转位序列的。

于 2012-10-15T20:24:01.200 回答
2

你可以看到这个网站http://graphics.stanford.edu/~seander/bithacks.html

反转位序列
反转位 显而易见的方式
通过查找表
反转字中的位 使用 3 次操作(64 位乘法和模除法)
反转字节中的位 使用 4 次操作(64 位乘法,无除法)反转字节中的位)
用 7 次操作反转字节中的位(没有 64 位,只有 32 次)
用 5 * lg(N) 操作并行反转 N 位数量

于 2012-10-15T20:23:55.790 回答