C反向二进制

时间:2012-10-15 20:20:50

标签: c binary binary-operators

  

可能重复:
  C reverse bits in unsigned integer

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

E.g:

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

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:3)

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

答案 2 :(得分:2)

您可以看到此网站http://graphics.stanford.edu/~seander/bithacks.html

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