位掩码和位数组之间有区别吗?

时间:2018-09-22 00:35:15

标签: c

我听说过两个术语可以互换使用。有区别吗?

例如,

unsigned char chessboard : 64; /* Bit mask */
unsigned char chessboard_2 [64]; /* Bit array */

2 个答案:

答案 0 :(得分:2)

它们都不是位掩码。第一个是位域的定义,该位域仅应作为结构成员有效,第二个是64 unsigned char s数组。

答案 1 :(得分:2)

位掩码

位掩码是一个二进制值,当使用按位运算符时,用于引用整数值中的特定位。例如,您可能有:

unsigned int low3 = 0x7;

这是设置了低阶3位的位掩码。然后,您可以使用它来提取值的一部分:

unsigned int value = 030071;
unsigned int value_low3 = value & low3; // result is 01

或更新部分价值:

unsigned int newvalue = (value & ~low3) | 5; // result is 030075

位数组

位数组是一个无符号整数或一个无符号整数数组,用于保存一系列布尔标志,其中每个值都位于整数的不同位中。如果要存储大量的布尔值,则与将每个值放在单独的数组元素中相比,这样可以节省大量内存。

但是,这是一个折衷方案:要访问特定的标志,您需要使用屏蔽和移位。

如果您的位数组足够小以适合单个整数,则可以声明:

uint32_t bitarray;

然后使用以下命令访问其特定元素:

bitvalue = (bitarray >> bitnum) & 0x1;

并设置一个元素:

bitarray |= (1u << bitnum);

并清除一个元素:

bitarray &= ~(1u << bitnum);

如果位数组需要多个字,则声明一个数组。通过将位数除以每个数组元素中的位数获得数组索引,然后使用余数确定该单词中的位数并使用上面的表达式。