C 为特定数字设置 3 位

C set 3 bits for a particular number

我正在尝试理解掩码概念并想在 C 中设置 uint32_t 数字的第 24、25、26 位。

我有一个例子

uint32_t数据=0;

我正在接受 uint_8 用户的输入,它只能是值 3 和 4 (011,100)

我想在数据变量的第 24、25、26 位中设置值 011 或 110,而不干扰其他位。

谢谢。

要在不修改其他位的情况下设置整数的第 24、25 和 26 位,您可以使用此模式:

data = (data & ~((uint32_t)7 << 24)) | ((uint32_t)(newBitValues & 7) << 24);

第一个 & 操作清除了这三个位。然后我们使用另一个 & 操作来确保我们有一个介于 0 和 7 之间的数字。然后我们将它向左移动 24 位并使用 | 将这些位放入最终结果。

我有一些 uint32_t 转换只是为了确保此代码在 int 少于 32 位的系统上正常工作,但除非您正在编写嵌入式系统,否则您可能不需要这些.

更通用的方法宏和函数。两者都一样有效,因为优化编译器做得非常好。宏将位置 sdn 位设置为 nd。函数具有相同的参数顺序。

#define MASK(n)   ((1ULL << n) - 1)
#define SMASK(n,s) (~(MASK(n) << s))
#define NEWDATA(d,n,s) (((d) & MASK(n)) << s)
#define SETBITS(d,nd,n,s) (((d) & SMASK(n,s)) | NEWDATA(nd,n,s))

uint32_t setBits(uint32_t data, uint32_t newBitValues, unsigned nbits, unsigned startbit)
{
    uint32_t mask = (1UL << nbits) - 1;
    uint32_t smask = ~(mask << startbit);
    data = (data & smask) | ((newBitValues & mask) << startbit);
    return data;
}