我试图存储在运行时确定的大量布尔信息.我想知道最好的方法是什么.
我目前一直在尝试使用以下方式分配内存:
pStatus = malloc((<number of data points>/8) + 1);
认为这会给我足够的工作量.然后我可以使用数组表示法中的指针引用每个布尔值:
pStatus[element]
不幸的是,这似乎并不是很好.首先,我很难将内存初始化为整数值0.这可以用memset()吗?尽管如此,我认为这不会影响我尝试访问时崩溃的原因pStatus[element].
我也不完全相信这种方法是最好的方法.我真正想要的本质上是一个反映布尔值状态的巨型位掩码.我错过了什么吗?
The*_*aul 29
pStatus = malloc((<number of data points>/8) + 1);
Run Code Online (Sandbox Code Playgroud)
这确实为您的位分配了足够的字节.然而,
pStatus[element]
Run Code Online (Sandbox Code Playgroud)
这访问元素的第一个字节,而不是位.因此,当元素超过总位数的八分之一时,您将访问分配的数组的末尾.
我会定义一些辅助函数
int get_bit(int element)
{
uint byte_index = element/8;
uint bit_index = element % 8;
uint bit_mask = ( 1 << bit_index);
return ((pStatus[byte_index] & bit_mask) != 0);
}
void set_bit (int element)
{
uint byte_index = element/8;
uint bit_index = element % 8;
uint bit_mask = ( 1 << bit_index);
pStatus[byte_index] |= bit_mask);
}
void clear_bit (int element)
{
uint byte_index = element/8;
uint bit_index = element % 8;
uint bit_mask = ( 1 << bit_index);
pStatus[byte_index] &= ~bit_mask;
}
Run Code Online (Sandbox Code Playgroud)
(为了清楚起见,错误地检查了元素的范围.你也可以制作这个宏)
......认为这会给我足够的工作量.然后我可以使用数组表示法中的指针引用每个布尔值:
pStatus[element]
Run Code Online (Sandbox Code Playgroud)
元素是寻址字节,而不是位.你想要的东西:
pStatus[element/8] & (1 << (element % 8))
Run Code Online (Sandbox Code Playgroud)