2012-10-15 144 views
3

可能重复:
C reverse bits in unsigned integerC反向二进制

我可如何扭转只能使用二进制运算符的二进制数?

如:

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

呼叫它反向代替? – auselen

+3

http://stackoverflow.com/a/9144870/745924 –

+0

完成'S /翻转/反转/',与“反转”是太容易认为你只是想要一个'not'。 –

回答

10

对于这样的事情,我建议你看一看Bit Twiddling Hacks的真棒页。

下面是从页面取只是一个例子溶液:

3个操作(64位乘法和 模数除法)

unsigned char b; // reverse this (8-bit) byte 
b = (b * 0x0202020202ULL & 0x010884422010ULL) % 1023; 
反向在一个字节中的位

而且在评论中指出,这里的另一种选择:

反向并联的N位量在5 * LG(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); 
+0

我要发布此,但你打我给它。 – Wug

+0

那么32位变量呢? –

+0

@FredericoSchardong请参考第'反向并联的N位量在5 * LG(N)中位操作黑客operations'。 – ahmad

2

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

倒车位序列
位反转明显的方式在字
反位通过查找表
一个字节反转位用3个操作(64位乘法和模量除)
反向在一个字节中的位和4点的操作(64位乘法,没有迪维锡永)
7个操作(没有64位反向在一个字节中的比特,仅32)
反向并联的N位量与5 * LG(N)操作