In C/C++ what's the simplest way to reverse the order of bits in a byte? In C/C++ what's the simplest way to reverse the order of bits in a byte? c c

In C/C++ what's the simplest way to reverse the order of bits in a byte?


This should work:

unsigned char reverse(unsigned char b) {   b = (b & 0xF0) >> 4 | (b & 0x0F) << 4;   b = (b & 0xCC) >> 2 | (b & 0x33) << 2;   b = (b & 0xAA) >> 1 | (b & 0x55) << 1;   return b;}

First the left four bits are swapped with the right four bits. Then all adjacent pairs are swapped and then all adjacent single bits. This results in a reversed order.


I think a lookup table has to be one of the simplest methods. However, you don't need a full lookup table.

//Index 1==0b0001 => 0b1000//Index 7==0b0111 => 0b1110//etcstatic unsigned char lookup[16] = {0x0, 0x8, 0x4, 0xc, 0x2, 0xa, 0x6, 0xe,0x1, 0x9, 0x5, 0xd, 0x3, 0xb, 0x7, 0xf, };uint8_t reverse(uint8_t n) {   // Reverse the top and bottom nibble then swap them.   return (lookup[n&0b1111] << 4) | lookup[n>>4];}// Detailed breakdown of the math//  + lookup reverse of bottom nibble//  |       + grab bottom nibble//  |       |        + move bottom result into top nibble//  |       |        |     + combine the bottom and top results //  |       |        |     | + lookup reverse of top nibble//  |       |        |     | |       + grab top nibble//  V       V        V     V V       V// (lookup[n&0b1111] << 4) | lookup[n>>4]

This fairly simple to code and verify visually.
Ultimately this might even be faster than a full table. The bit arith is cheap and the table easily fits on a cache line.


If you are talking about a single byte, a table-lookup is probably the best bet, unless for some reason you don't have 256 bytes available.