我有两个单独的位域组成一个“身份”字段,长度为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位是很重要的,那里有各种子字段,我将采用此输出并通过另一个位字段来解析这些子字段。
您是否能够协助我如何将上述BID和IDEX组合成一个29位的组合位域?不幸的是,它们在BID和IDEX字段之间有两位在标题中被忽略,这就是为什么我不能将我的位域设置为29位。
答案 0 :(得分:2)
您应首先移位18位然后执行OR。例如:
int result = (BID<<18) | IDEX;
否则你将覆盖第一个块。你在这里做的是移位11位,然后用18位进行OR运算,这确实破坏了前11位。