掩码定义要保留哪些位以及要清除哪些位。
屏蔽是将屏蔽应用于值的行为。这是通过执行以下操作来完成的:
- 按位与运算以提取值中的位子集
- 按位或运算以设置值中的位子集
- 按位异或以切换值中的位子集
下面是提取值中的位子集的示例:
Mask: 00001111b
Value: 01010101b
对值应用掩码意味着我们要清除前(高)4 位,并保留后(低)4 位。这样我们就提取出了低 4 位。结果是:
Mask: 00001111b
Value: 01010101b
Result: 00000101b
掩码是使用 AND 实现的,因此在 C 语言中我们得到:
uint8_t stuff(...) {
uint8_t mask = 0x0f; // 00001111b
uint8_t value = 0x55; // 01010101b
return mask & value;
}
这是一个相当常见的用例:从较大的字中提取单个字节。我们将字中的高位定义为第一个字节。我们为此使用两个运算符,&
, and >>
(右移)。这是我们从 32 位整数中提取四个字节的方法:
void more_stuff(uint32_t value) { // Example value: 0x01020304
uint32_t byte1 = (value >> 24); // 0x01020304 >> 24 is 0x01 so
// no masking is necessary
uint32_t byte2 = (value >> 16) & 0xff; // 0x01020304 >> 16 is 0x0102 so
// we must mask to get 0x02
uint32_t byte3 = (value >> 8) & 0xff; // 0x01020304 >> 8 is 0x010203 so
// we must mask to get 0x03
uint32_t byte4 = value & 0xff; // here we only mask, no shifting
// is necessary
...
}
请注意,您可以切换上面运算符的顺序,您可以先执行蒙版,然后执行移位。结果是相同的,但现在您必须使用不同的掩码:
uint32_t byte3 = (value & 0xff00) >> 8;