struct base {
static const int TABLE[256];
static const int UINT_SIZE = sizeof(unsigned int);
union uint_uchar {
unsigned int i;
unsigned char a[UINT_SIZE];
};
};
template <bool LITTLE_ENDIAN>
struct CPU : base {
static int get_bit_num(unsigned int m) {
uint_uchar uc;
uc.i = m;
for(int i = UINT_SIZE - 1; i >= 0; --i) {
int bits = TABLE[uc.a[i]];
if(bits) {
return bits + i * 8;
}
}
return 0;
}
};
template<>
struct CPU<false> : base {
static int get_bit_num(unsigned int m) {
uint_uchar uc;
uc.i = m;
for(int i = 0; i < UINT_SIZE; ++i) {
int bits = TABLE[uc.a[i]];
if(bits) {
return bits + (UINT_SIZE - i - 1) * 8;
}
}
return 0;
}
};