位掩码是否与位中的 "accessing an array" 相当?

Is bit masking comparable to "accessing an array" in bits?

对于我见过的所有位掩码定义,它们都只是深入探讨如何位掩码、按位使用等,而没有解释其中任何一个的用例。目的是把所有你想保留的位和所有你想清除的位都更新为"access an array"位吗?

Is the purpose of updating all the bits you want to keep and all the bits you want to clear to "access an array" in bits?

我会说答案是

当您访问 int 的数组时,您将执行:

int_array[index] = 42;  // Write access
int x = int_array[42];  // Read access

如果你想为 read/write 中的特定位编写类似的函数,例如"array like fashion" 中的 unsigned int 可能看起来像:

unsigned a = 0;
set_bit(a, 4);   // Set bit number 4
unsigned x = get_bit(a, 4); // Get bit number 4

set_bitget_bit 的实现将需要(除其他事项外)一些按位掩码操作。

所以 - 要访问 "array like fashion" 中的位,您需要屏蔽 但是...

位级屏蔽还有许多其他用途。

示例:

int buffer[64];
unsigned index = 0;

void add_to_cyclic_buffer(int n)
{
    buffer[index] = n;
    ++index;
    index &= 0x3f;  // Masking by 0x3f ensures index is always in the range 0..63
}

示例:

unsigned a = some_func();

a |= 1;  // Make sure a is odd
a &= ~1; // Make sure a is even

示例:

unsigned a = some_func();

a &= ~0xf;  // Make sure a is a multiple of 16

这只是使用 "masking" 的几个示例,与以数组形式访问位无关。还有很多其他的例子。

所以总结:

掩码可用于编写访问数组中位的函数,但掩码也可用于许多其他事情。

所以有 3(或 4)种主要用途。

一个,正如您所说,是将单词用作一组 true/false 标志,其中每个标志都以对称方式索引。我在这里使用 'word' 作为您在单个操作中访问的离散内存。所以一个字节包含 8 位值,而 'long long' 包含 64 位。通过更多的努力,一个单词数组可以用作更多打包标志的数组。

第二个是您对值进行一些操作,但仍然认为该词保留一个值。有很多技巧,例如设置或清除底部位以确保对齐,或清除顶部位以获得模数,移位以除以或乘以 2 的幂。

第三种用途是将许多较小范围的值打包成一个词。每个值在上下文中都有特定的含义。这可能是因为您需要与已将其定义为协议的设备进行通信,或者是因为您需要创建如此多的对象,以至于每个对象中 space 的节省超过了代码大小和代码速度的增加成本(尽管这可能与增加的缓存未命中率形成对比,如果对象更大则导致速度减慢)。

作为区别,第四种情况是这些字段是不同的 1 位标志,在代码的上下文中具有特定含义。数据对象倾向于收集许多这样的标志,有时将它们作为位存储在一个位置比为每个标志使用单独的字节更方便。一般来说,测试一个特定的固定索引位或一个固定的屏蔽位在代码大小或速度上并不比测试整个字节更昂贵,尽管编写可能更复杂。存储空间的节省是显而易见的,因此当面对在结构中创建多个标志或编写函数时,程序员通常会默认声明位掩码枚举。