作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我是 C 编程的新手,我遇到了位掩码。位掩码的一般概念和作用是什么?
非常感谢示例。
最佳答案
掩码定义了您要保留的位以及要清除的位。
掩码是对值应用掩码的行为。这是通过执行以下操作实现的:
下面是提取值中位的子集的示例:
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;
关于c - 什么是位掩码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10493411/
我是一名优秀的程序员,十分优秀!