Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 什么是比特屏蔽?_C_Bit Manipulation_Bitwise Operators_Terminology_Bitmask - Fatal编程技术网

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位。

我对C编程相当陌生,我遇到了位屏蔽。有人能给我解释一下位屏蔽的一般概念和功能吗?示例非常受欢迎。

掩码定义了要保留的位和要清除的位

屏蔽是将屏蔽应用于值的行为。这是通过以下方式实现的:

  • 按位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]