是的,您只需定义一个 32 位整数数组。然后操作数组的特定元素。
给定一个从 0 到 255(包括)的位 ID(例如),这将是一个数组:
unsigned int bits[8];
为了找到对哪个元素进行操作:
unsigned int index = bitId >> 5; // turns 0..255 into 0..31
获取给定位 ID 的掩码:
unsigned int masks[] = {
0x0001, 0x0002, 0x0004, 0x0008,
0x0001, 0x0020, 0x0040, 0x0080,
0x0100, 0x0200, 0x0400, 0x0800,
0x1000, 0x2000, 0x4000, 0x8000
};
unsigned int mask = masks[bitId & 0x1f];
如果您的实现中有 uint32_t 类型可用,那可能是最安全的方法。否则,有一些已知的方法可以使用unsigned int 使用CHAR_BIT 和sizeof 在运行时实际计算出masks 数组的大小以及应该使用哪些值来发现数组索引和位掩码索引。
例如,我的代码库中的这个 sn-p 显示了我如何为基于字符的位掩码做到这一点:
static unsigned char bitmask[CHAR_BIT];
void bitsetInit (void) {
unsigned char mask = 1;
int i = 0;
while (i < CHAR_BIT) {
bitmask[i++] = mask;
mask <<= 1;
}
}
并使用:
bsp->bits[bitnum/CHAR_BIT] &= ~bitmask[bitnum%CHAR_BIT];
bsp->bits[bitnum/CHAR_BIT] |= bitmask[bitnum%CHAR_BIT];
分别用于清除和设置位。
如果您想使用unsigned int 而不是unsigned char,您只需计算相应的位数:
unsigned int UINT_BIT = CHAR_BIT * sizeof (unsigned int);
并在我上面使用过CHAR_BIT 的地方使用它(如果需要,mask 数组可以在运行时动态分配)。