看代码中发现了一段一时间能理解(N年的老司机猜也能猜到了)但是又不太确定的代码:
union SID {
SID(uint32_t sid) : sid_(sid) {}
struct {
uint32_t game_id_:16;
uint32_t role_idx_:16;
};
uint32_t sid_;
};
明显这段代码的意思是game_id_和role_idx_各占16位,相当于平分了sid_的空间,至于game_id_和role_idx_谁占高位谁占地位,实验得出game_id_占低位(可能不同的平台因大小端字节序而不一致,没有详细研究)。
structu这种分段的写法以前读书的时候好像在哪里见过,工作的时候很少见到有人这么用,当然这与特定的业务逻辑场景有关。突然想着这种方式其实还很有用,例如tcp的协议头里面就有一些字段的大小只有几位,经常是连续的几个字段共用一个多个字节。这种情况下,用struct 分段的写法就非常有用,而且结构清晰明了。利用位移的方法就显得不那么直观,而且容易出错。
示例:
typedef struct _bits {
int a : 1;
int b : 1;
int c : 1;
int d : 1;
int e : 2;
}bits;
bits bit;
bit.a = 1;
bit.b = 1;
bit.d = 1;
bit.e = 2;
//bit = 43 0x101011
在最上面的代码中,结合联合体的使用,达到将一个内存数据拆分为高位和地位数据部分的目的。高位和地位的使用在标志量中应用很多,上面的方法不失为一种简单优雅的方法。
参考:
https://blog.csdn.net/iliuxi_/article/details/75040584