C语言实现数据位的反转、调换,大小端、大头小头

本文介绍了C++中ReverseBits宏函数系列,用于反转不同位数的整数,以及ReverseAnyBits模板函数,可以处理任意位数的位反转。示例展示了如何使用这些函数进行位操作并输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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 
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值