如何连接两个 BitField

How to Concatenate two BitFields

我有两个单独的位域组成一个 "Identity" 字段,长度为 11 + 18 位(总共 29 位)。

在位域中,它们具有预期的大小:

header a;
memset(a.arr, 0, sizeof(a.arr));
a = {0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0,0xA0}; // 1010 0000

cout << hex << a.BID << endl; // 010 0000 1010 -> 20a
cout << hex << a.IDEX << endl; // 00 1010 0000 1010 0000 -> a0a0

我需要做的是将这些字段组合成一个 29 位的段,例如010 0000 1010 00 1010 0000 1010 0000.

当尝试连接两个位域时,结果不是我所期望的:

int BID = a.BID;
int IDEX = a.IDEX;    
int result = (BID<<11) | IDEX;
cout << BID << endl;
printf("%x %d",result, result);  // -> 10f0a0 (21 bits) where I expect 828A0A0 (29 bits)

拥有所有 29 位对我来说很重要,因为在这个 29 位字段中有各种子字段,我打算获取此输出并通过另一个 bit-field 来解析这些子字段。

您能否帮助我如何将上面提到的 BID 和 IDEX 组合成一个 29 位的组合位域?不幸的是,它们在 header 中的 BID 和 IDEX 字段之间有两位被忽略,这就是为什么我不能将我的位字段设置为 29 位。

你应该先移动18位,然后再做OR。例如:

int result = (BID<<18) | IDEX;

否则你将覆盖第一个块。你在这里做的是移动 11 位,然后与 18 位进行 ORing,这确实破坏了前 11 位。