如何连接两个BitFields

问题描述 投票:2回答:1

我有两个单独的位域组成一个“身份”字段,长度为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位。

c++ bit-fields can-bus
1个回答
2
投票

您应该首先移位18位然后执行OR。例如:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.