当前位置:  开发笔记 > 编程语言 > 正文

我可以在C中分配特定的位数吗?

如何解决《我可以在C中分配特定的位数吗?》经验,为你挑选了3个好方法。

我试图存储在运行时确定的大量布尔信息.我想知道最好的方法是什么.

我目前一直在尝试使用以下方式分配内存:

pStatus = malloc((/8) + 1);

认为这会给我足够的工作量.然后我可以使用数组表示法中的指针引用每个布尔值:

pStatus[element]

不幸的是,这似乎并不是很好.首先,我很难将内存初始化为整数值0.这可以用memset()吗?尽管如此,我认为这不会影响我尝试访问时崩溃的原因pStatus[element].

我也不完全相信这种方法是最好的方法.我真正想要的本质上是一个反映布尔值状态的巨型位掩码.我错过了什么吗?



1> The Archetyp..:
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;
}

(为了清楚起见,错误地检查了元素的范围.你也可以制作这个宏)


你不应该假设一个字节是8位.如果需要,使用CHAR_BIT而不是8,包括.这似乎适用于此主题中的大多数评论.
根据您的计算机/编译器,以32/64位[整数]字的形式执行此操作可能更有效.自80年代以来,我的电脑没有8位内存总线.

2> Ana Betts..:

......认为这会给我足够的工作量.然后我可以使用数组表示法中的指针引用每个布尔值:

pStatus[element]

元素是寻址字节,而不是位.你想要的东西:

pStatus[element/8] & (1 << (element % 8))



3> orip..:

小点:要获得足够的内存来存储N位,(N/8)+ 1个字节是不精确的(可能是一个太多).

但是,(N + 7)/ 8始终是最小数字.

推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有