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 nbits, unsigned startbit)
{
uint32_t mask = (1UL << nbits) - 1;
uint32_t smask = ~(mask << startbit);
data = (data & smask) | ((newBitValues & mask) << startbit);
return data;
}
我正在尝试理解掩码概念并想在 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 nbits, unsigned startbit)
{
uint32_t mask = (1UL << nbits) - 1;
uint32_t smask = ~(mask << startbit);
data = (data & smask) | ((newBitValues & mask) << startbit);
return data;
}