我正在尝试使用unsigned int构造一个32位二进制值。这是怎么回事 32位被分成几部分
第1部分= 4位
第2部分= 2位
第3部分= 12位
第4部分= 2位
第5部分= 12位
如何使用部件构造32位二进制值(unsigned int) 位移可以有人请帮助
(不能换位......如果我想更新某些部分怎么办?)
答案 0 :(得分:6)
您只需按照建议使用移位:
uint32_t x = (part1 << 28)
| (part2 << 26)
| (part3 << 14)
| (part4 << 12)
| (part5);
答案 1 :(得分:5)
看起来你想要这个值:
part5 + (part4 << 12) + (part3 << 14) + (part2 << 26) + (part1 << 28)
(确保所有五个变量都是uint32_t
类型或类似的。)
答案 2 :(得分:4)
这是典型的位移/位掩码。以下是设置初始值的方法:
uint32_t value = ((part1 & 0xF) << 28)
| ((part2 & 0x3) << 26)
| ((part3 & 0xFFF) << 14)
| ((part4 & 0x3) << 12)
| (part5 & 0xFFF);
每一行使用按位AND (&)
来清除每个部分的高位,因此它不会在最终值中溢出其分配的位宽。例如,如果part4是0xFF并且您忘记了& 0x3
那么part4(0xFC)的高6位将溢出到part3的区域。然后,零件将(<<)
移动到其最终位置,并与其余零件按位或(|)
。
一些开发人员通过位域实现了相同的目标,但由于潜在的可移植性问题,我不推荐这种方法。
到目前为止,大多数(全部?)其他答案都忘记了解决方案的按位AND部分。如果零件值超过指定的位宽,他们的答案将导致错误。
如果要更新值的特定部分,则需要通过按位AND和按位OR进行更多位掩码。例如,要更新第4部分,您可以执行以下操作:
value &= ~(0x3 << 12); /* Clear the part4 region */
value |= (part4 & 0x3) << 12; /* Set the part4 region to the new value */
如果你是C中的新工作,第一行有点棘手。它说取0x3并将其移位12(结果= 0x00003000),执行按位补码(结果= 0xFFFFCFFF),并设置值相等自己按位与该结果进行对比。这就是你清除值的part4区域的方法......因为你是按位并且该区域为零,结果是该区域现在为零。
第二行将归零的part4区域设置为新值,就像我们在设置初始值时所做的那样。