#define Reverse32Bits(bits/*{0<bits && bits<=8}*/,src,result) { \
int i = 0,byte_length = sizeof(src)<<3;\
union{\
struct{\
uint32_t bit0:bits;\
uint32_t bit:(32-bits-bits);\
uint32_t bit31:bits;\
}Bits;\
uint32_t value;\
}src_##src_##result, result_##src_##result;\
src_##src_##result.value=src;\
result_##src_##result.value=0;\
for ( ; i < byte_length; i+=bits )\
{\
result_##src_##result.value>>=bits;\
result_##src_##result.Bits.bit31=src_##src_##result.Bits.bit31;\
src_##src_##result.value<<=bits;\
}\
result = result_##src_##result.value;\
}
#define Reverse16Bits(bits/*{0<bits && bits<=4}*/,src,result) { \
int i = 0,byte_length = sizeof(src)<<3;\
union{\
struct{\
uint16_t bit0:bits;\
uint16_t bit:(8-bits-bits);\
uint16_t bit31:bits;\
}Bits;\
uint16_t value;\
}src_##src_##result, result_##src_##result;\
src_##src_##result.value=src;\
result_##src_##result.value=0;\
for ( ; i < byte_length; i+=bits )\
{\
result_##src_##result.value>>=bits;\
result_##src_##result.Bits.bit31=src_##src_##result.Bits.bit31;\
src_##src_##result.value<<=bits;\
}\
result = result_##src_##result.value;\
}
#define Reverse8Bits(bits/*{0<bits && bits<=2}*/,src,result) { \
int i = 0,byte_length = sizeof(src)<<3;\
union{\
struct{\
uint8_t bit0:bits;\
uint8_t bit:(8-bits-bits);\
uint8_t bit31:bits;\
}Bits;\
uint8_t value;\
}src_##src_##result, result_##src_##result;\
src_##src_##result.value=src;\
result_##src_##result.value=0;\
for ( ; i < byte_length; i+=bits )\
{\
result_##src_##result.value>>=bits;\
result_##src_##result.Bits.bit31=src_##src_##result.Bits.bit31;\
src_##src_##result.value<<=bits;\
}\
result = result_##src_##result.value;\
}
template<typename _Tp>
static inline _Tp ReverseAnyBits ( int bits, _Tp src ) {
int i = 0, byte_length = sizeof(src)<<3;
_Tp _src, _result, fristBit;
fristBit = ((0x01ull<<bits)-1)<<(byte_length-bits);
_src = src;
_result = 0;
for ( ; i < byte_length; i+=bits )
{
_result >>= bits;
_result &= (~fristBit);
_result += _src & fristBit;
_src <<= bits;
}
return _result;
}
使用例子
uint32_t temp ;
Reverse32Bits( 1, 0xaaaaaaaa, temp );
qDebug("0x%0.8X ", temp );
Reverse32Bits( 4, 0x12345678, temp );
qDebug("0x%0.8X ", temp );
Reverse32Bits( 8, 0x12345678, temp );
qDebug("0x%0.8X ", temp );
/*
0x55555555
0x87654321
0x78563412
*/
qDebug("0x%0.16llX ", ReverseAnyBits<uint64_t>( 4, 0x1122334455667788ull ) );
qDebug("0x%0.16llX ", ReverseAnyBits<uint64_t>( 4, 0xabcdef4455667788ull ) );
qDebug("0x%0.16llX ", ReverseAnyBits<uint64_t>( 8, 0xabcdef4455667788ull ) );
qDebug("0x%0.8X ", ReverseAnyBits<uint32_t>( 1, 0x96969696 ) );
qDebug("0x%0.8X ", ReverseAnyBits<uint32_t>( 1, 0xaaaaaaaa ) );
qDebug("0x%0.8X ", ReverseAnyBits<uint32_t>( 1, 0x44332211 ) );
qDebug("0x%0.8X ", ReverseAnyBits<uint32_t>( 4, 0x11223344 ) );
qDebug("0x%0.8X ", ReverseAnyBits<uint32_t>( 8, 0x44332211 ) );
qDebug("0x%0.8X ", ReverseAnyBits<uint32_t>( 16, 0x44332211 ) );
qDebug("0x%0.16llX ", ReverseAnyBits<uint64_t>( 8, 0xabcdef4455667788ull ) );
qDebug("0x%0.16llX ", ReverseAnyBits<uint64_t>( 4, 0xabcdef4455667788ull ) );
qDebug("0x%0.16llX ", ReverseAnyBits<uint64_t>( 4, 0x1122334455667788ull ) );
/*
0x8877665544332211
0x8877665544FEDCBA
0x8877665544EFCDAB
0x69696969
0x55555555
0x8844CC22
0x44332211
0x11223344
0x22114433
0x8877665544EFCDAB
0x8877665544FEDCBA
0x8877665544332211
*/