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