是的,您只需定义一个 32 位整数数组即可。然后操作数组的特定元素。
给定一个从 0 到 255 的位 ID(例如),这将是一个数组:
unsigned int bits[8];
为了找到which要操作的元素:
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
using CHAR_BIT
and sizeof
在运行时实际计算出要制作多大masks
array 以及应该使用什么值来发现数组索引和位掩码索引。
例如,我的代码库中的这段代码显示了我如何对基于字符的位掩码执行此操作:
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
如果需要的话,可以在运行时动态分配数组)。