什么是位掩码?
我对C编程相当陌生,并且遇到了位掩码的问题。 有人能向我解释位掩码的一般概念和function吗? 例子非常感谢。
一个掩码定义你想要保留哪些位,以及哪些位要清除。
掩蔽是将掩码应用于某个值的行为。 这是通过做:
- 按位与,以提取值中的一个位的子集
- 按位或运算来设置值的一个子集
- 按位XORing,以切换值中的一个位的子集
下面是一个提取值中的一个位的子集的例子:
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; }
这是一个相当常见的用例:从较大的单词中提取单个字节。 我们将字中的高位定义为第一个字节。 我们使用两个操作符, &
和>>
(右移)。 这就是我们如何从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;