C反向二进制

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

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

例如:

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

对于这种事情,我建议你看看令人敬畏的页面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); 

看看Bit Twiddling Hacks 。 有一个关于反转位序列的整个部分。

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

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