楼主在编写代码的时候遇到这样一个例子:一个24bit的序列需要分成多段进行独立赋值,之后再对整体进行其他处理。主要问题是 如果使用vector容器,第一步的赋值容易,但第二步的整体处理需要先转化为string,再转为uint32处理,步骤很繁琐;如果直接按多段uint32赋值,则需要将多段数据整合为一个uint32处理,也比较麻烦。
此时使用union关键字,目的是赋值的时候可以每段分别独立赋值,处理时又可以作为一个整体来处理
使用union关键字来实现此目的的关键在于内存地址的共用。
union lib_wifi5_l_sig_filed_t
{
struct
{
uint32 RATE : 4;
uint32 R : 1;
uint32 LENGTH : 12;
uint32 P : 1;
uint32 SIGNAL_TALL : 6;
}bits;
uint32 value;
};
void test()
{
lib_wifi5_l_sig_filed_t lsig = {0};//初始化为0
//分段赋值
lsig.bits.RATE = 0b1011;
lsig.bits.R = 0;
lsig.bits.length = 0b101101110001;
lsig.bits.SIGNAL_TALL = 0;
//整体操作
uint32 check_seq = lsig.value & 0x1FFFF;//取前17bit
lsig.bits.P = deal_parity_check(check_seq);//校验
uint32 result = lsig.value & 0xffffff;//取24bit
}
如上图代码所示,在union中bits与value内存首地址一致,故分段赋值时使用bits,整体操作时使用value即可。