我试图存储大量的布尔信息,这些信息是在运行时确定的。我想知道最好的方法是什么。
我目前正在尝试使用以下方法分配内存:
pStatus = malloc((<number of data points>/8) + 1);
我想这会给我足够的时间来工作。然后,我可以使用数组表示法中的指针引用每个布尔值:
pStatus[element]
不幸的是,这似乎不是很好的工作。首先,我很难将内存初始化为整数值0。这可以用memset()来完成吗?不过,我不认为这会影响我在尝试访问pStatus[element]时崩溃的原因。
我也不完全相信这种方法是最好的。我真正想要的是一个反映布尔值状态的巨大位掩码。我错过什么了吗?

最佳答案

pStatus = malloc((<number of data points>/8) + 1);

这确实为您的位分配了足够的字节。然而,
pStatus[element]

这将访问元素的第个字节,而不是位。因此,当元素超过总位数的八分之一时,您将访问分配的数组的末尾。
我将定义几个helper函数
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;
}

(为清楚起见,检查遗漏的元素范围时出错。你也可以制作这个宏)

07-28 02:54
查看更多