如何更改无符号字节(或更大)中的一系列位,而不关心这些范围内的当前位是什么。
0bXXXX'XXXX
我想将位置 2,3,4 处的位设置为 0b101,所以最后字节应该变成:
0bXXXX'101X
我认为 2,3 和 4 位的掩码将是 0b0000'1110 或 12
我尝试过:
unsigned char b = 255;
b = 0b101 & ~( 12 << 1);
但是这会打印:
0000'0101
清除位:
byte &= ~(0b111 << 2);
byte |= 0b101 << 2;
但请注意规则#1:没有“幻数”。 0b101 是什么?为什么我们要把它移 2?因此,首先定义命名常量。如果我们正在处理的位字段被命名为“FOO”,那么例如:
#define FOO_POS 2
#define FOO_MASK 0x7u
#define FOO (FOO_MASK << FOO_POS)
完整示例(C23):
#include <stdio.h>
#define FOO_POS 2
#define FOO_MASK 0x7u
#define FOO (FOO_MASK << FOO_POS)
int main(void)
{
unsigned int bar = 0xFF;
printf("%.2X %.8b\n", bar, bar);
bar &= ~FOO;
printf("%.2X %.8b\n", bar, bar);
bar |= ((0b101 & FOO_MASK) << FOO_POS);
printf("%.2X %.8b\n", bar, bar);
}
只是不要把这样的宏搞得太过分,并开始发明一些丑陋的 setter/getter 宏语言来设置位。 C 程序员应该了解按位运算,因此无需将它们隐藏在丑陋的宏后面,因为当显式键入时它们已经是最清晰的。