C 什么是比特屏蔽?
我对C编程相当陌生,我遇到了位屏蔽。有人能给我解释一下位屏蔽的一般概念和功能吗?示例非常受欢迎。掩码定义了要保留的位和要清除的位 屏蔽是将屏蔽应用于值的行为。这是通过以下方式实现的:C 什么是比特屏蔽?,c,bit-manipulation,bitwise-operators,terminology,bitmask,C,Bit Manipulation,Bitwise Operators,Terminology,Bitmask,我对C编程相当陌生,我遇到了位屏蔽。有人能给我解释一下位屏蔽的一般概念和功能吗?示例非常受欢迎。掩码定义了要保留的位和要清除的位 屏蔽是将屏蔽应用于值的行为。这是通过以下方式实现的: 按位ANDing,以提取值中位的子集 按位ORing,以便在值中设置位的子集 按位异或,以切换值中位的子集 下面是提取值中位的子集的示例: Mask: 00001111b Value: 01010101b 将掩码应用于该值意味着我们希望清除前(高)4位,并保留最后(低)4位。因此,我们提取了较低的4位。
- 按位ANDing,以提取值中位的子集
- 按位ORing,以便在值中设置位的子集
- 按位异或,以切换值中位的子集
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;
屏蔽意味着保留/更改/删除所需信息的一部分。让我们来看看图像掩蔽操作;类似-此掩蔽操作是移除任何非皮肤的东西- 在本例中,我们正在执行和操作。还有其他掩蔽运算符-或,XOR
位屏蔽意味着对位施加屏蔽。这是一个有点掩蔽和- 因此,只剩下中间的4位(因为这些位在这个掩码中是
1
)
让我们看看这个XOR-
现在,中间的4位被翻转(1
变成0
,0
变成1
)
因此,使用位掩码,我们可以访问单个位[]。有时,此技术也可用于提高性能。以此为例,-
bool isOdd(int i) {
return i%2;
}
此函数用于判断整数是否为奇数/偶数。我们可以使用位掩码以更高的效率实现相同的结果-
bool isOdd(int i) {
return i&1;
}
简短解释:如果二进制数的长度为1
,则为奇数;对于0
它将是偶数。因此,通过执行和使用1
我们删除了除最低有效位以外的所有其他位,即:
55->0 0 1 0 1 1[输入]
(&)1->0 0 1[掩码]
---------------------------------------
1您是否了解诸如&^等位运算符和布尔逻辑的一般知识?任何关于掩码操作的解释都需要这样做。是的,我了解位运算符,布尔逻辑我知道链接不应该发布,但维基百科的解释很好:@pevik发布链接是可以的,但是有一些描述,这样如果某一天链接死了,帖子仍然能够满足其回答的目的。此外,链接不应仅用于促销目的。回答正确,但屏蔽也可用于设置或切换特定位与或异或操作以及合适的屏蔽。@user239558感谢示例和正确的语法。@Paul R.我会在下面的例子中简单地说mask和value吗user239558@Mr.Z在C、C++和相关语言中,你将使用位和运算符,它被写为<代码>和<代码>。例如,Mr.Z:通过屏蔽内容来清除UTI32 32的一个字节:<代码>定义掩码0x00 000 FF…我的_uint32&=~MASK
。部分混淆可能是因为描述实际情况的名词和动词选择不当。例如,像“位选择器”或“目标位”这样的词不是更适合描述对象而不是使用“位掩码”这个词吗?类似地,为了描述位操纵操作,使用诸如“位操纵”一词似乎比“屏蔽”一词更合适,因为后者仅适用于AND操作,而不适用于XORING(切换位)或or(设置位),XORING(切换位)或or(设置位)是位操纵或转换,而不是屏蔽操作,将整数转换为奇数。如果是偶数:i=i | 1。当我们试图生成像1、3、5、…、2、4、6……这样的序列时,这很方便。您还可以使用以下操作从整数中查找只有最低有效位的数字:lsb=i&-i
bool isOdd(int i) {
return i%2;
}
bool isOdd(int i) {
return i&1;
}
55 -> 0 0 1 1 0 1 1 1 [input]
(&) 1 -> 0 0 0 0 0 0 0 1 [mask]
---------------------------------------
1 <- 0 0 0 0 0 0 0 1 [output]