繁体   English   中英

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 位的系统上正常工作,但除非您正在对嵌入式系统进行编程,否则您可能不需要这些。

更通用的方法宏和函数。 两者都与优化编译器做得非常好一样有效。 宏将位置s处的d n位设置为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 startbit, unsigned nbits)
{
    uint32_t mask = (1UL << nbits) - 1;
    uint32_t smask = ~(mask << startbit);
    data = (data & smask) | ((newBitValues & mask) << startbit);
    return data;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM