#include <iostream>
#include <iomanip>
using namespace std;
struct reverse_t {
template <class T, int mask_bits>
struct loop {
static void exec(T &t){
T mask(0);
for(unsigned i(0); i < (((sizeof(T) * 8) >> 1) / mask_bits); i++){
for(unsigned j(0); j < mask_bits; j++){
mask <<= 1;
mask |= 0x1;
}
mask <<= mask_bits;
}
t = ((t << mask_bits) & mask) | ((t >> mask_bits) & (~mask));
loop<T, (mask_bits >> 1)>::exec(t);
}
};
template <class T>
struct loop<T, 1> {
static void exec(T &t){
T mask(0);
for(unsigned i(0); i < ((sizeof(T) * 8) >> 1); i++){
mask <<= 1;
mask |= 0x1;
mask <<= 1;
}
t = ((t << 1) & mask) | ((t >> 1) & (~mask));
}
};
template <class T>
void operator()(T &t){
loop<T, ((sizeof(T) * 8) >> 1)>::exec(t);
}
};
int main(){
reverse_t reverse;
unsigned int i(0xAA996655);
cout << hex;
cout << i << endl; // 0b 10101010 10011001 01100110 01010101
reverse(i);
cout << i << endl; // assume 0b 10101010 01100110 10011001 01010101 = 0xAA669955
return 0;
}