unsigned int reverse_bits(unsigned int m)
{
const int len = 8 * sizeof(m);
unsigned int mask = 1;
unsigned int retVal = 0;
for(int i = 0; i < len; i++) {
unsigned bit = m & (mask << i);
if(!bit)
continue;
int distance = len - i * 2 - 1;
if(distance >= 0) {
bit <<= distance;
} else {
bit >>= -distance;
}
retVal |= bit;
}
return retVal;
}