Reversing bit pairs
unsigned
int
i, j;
// positions of bit sequences to swap
unsigned
int
n;
// number of consecutive bits in each sequence
unsigned
int
b;
// bits to swap reside in b
unsigned
int
r;
// bit-swapped result goes here
unsigned int x = ((b >> i) ^ (b >> j)) & ((1U << n) - 1); // XOR temporary
r = b ^ ((x << i) | (x << j));
-----------------------------------------------------------
Another standard simple method:
unsigned
int
reverseBits(unsigned
int
num)
{
unsigned
int
count =
sizeof
(num) * 8 - 1;
unsigned
int
reverse_num = num;
num >>= 1;
while
(num)
{
reverse_num <<= 1;
reverse_num |= num & 1;
num >>= 1;
count--;
}
reverse_num <<= count;
return
reverse_num;
}
int
main()
{
unsigned
int
x = 1;
printf
(
"%u"
, reverseBits(x));
getchar
();
}
----------------------------------------------------------------
Another with n/2 complexity.
int bitreverse(int x)
{
unsigned int lmask = 0x80000000;
int rmask = 0x01;
while(mask1>mask2)
{
if(!(((lmask &x) != 0 && (rmask&x) != 0) || ((lmask &x)==0 && (rmask&x)==0)))
{
x=x^lmask;
x=x^rmask;
}
lmask >>=1;
rmask <<=1;
}
return x;
}
----------------------------------------------------------------
Reverse an N-bit quantity in parallel in 5 * lg(N) operations:
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);
The following variation is also O(lg(N)), however it requires more operations to reverse v. Its virtue is in taking less slightly memory by computing the constants on the fly.
unsigned int s = sizeof(v) * CHAR_BIT; // bit size; must be power of 2
unsigned int mask = ~0;
while ((s >>= 1) > 0)
{
mask ^= (mask << s);
v = ((v >> s) & mask) | ((v << s) & ~mask);
}
These methods above are best suited to situations where N is large. If you use the above with 64-bit ints (or larger), then you need to add more lines (following the pattern); otherwise only the lower 32 bits will be reversed and the result will be in the lower 32 bits.
Comments