如何连接两个 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 位。
我有两个单独的位域组成一个 "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 位。