在c中构造32位unsigned int

时间:2013-09-19 17:01:12

标签: c

我正在尝试使用unsigned int构造一个32位二进制值。这是怎么回事 32位被分成几部分

第1部分= 4位

第2部分= 2位

第3部分= 12位

第4部分= 2位

第5部分= 12位

如何使用部件构造32位二进制值(unsigned int) 位移可以有人请帮助

(不能换位......如果我想更新某些部分怎么办?)

3 个答案:

答案 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区域设置为新值,就像我们在设置初始值时所做的那样。