因此,我有一个无符号字符数组,当前我正在尝试编写Set方法(将给定索引中的位更改为1)。我能想到的最好方法是,不为整个数组创建掩码,而是创建一个字节大小的掩码,并仅使用用户要更改的给定位来掩码数组中的索引点。但是,我尝试做的每一种方法,要么用位索引中的1的全0的掩码对全0的掩码进行OR运算后,结果数组什么都没有发生,要么出现段错误。我能做的最好的就是更改第一个数组索引中的正确位。我现在如何设置我的代码,现在我知道为什么它只更改数组的第一个字节中的正确位,但是每次更改此位的尝试都失败了,我不认为这应该很难,我只是觉得我错过了一些东西,但是阅读和谷歌搜索页面却使我无处可去。到目前为止,这是我的代码的伪装...

void BitArray::Set (unsigned int index)
 70 {
 71     int spot;       // index in barray where
 72                     // bit to be set is located
 73     char mask;
 74     if (index < 8)
 75     {
 76         spot = 0;
 77         mask = 1 >> index - 1;
 78     }
 79     else
 80     {
 81         int spot = index / 8;
 82         mask = 1 << (index - (8*spot) - 1);
 83     }
 84
 85     *barray = *barray | mask;
 86 }

代替* barray = * barray |面具,我会直观地希望像barray [spot] = barray [spot] |面具;上类。任何帮助是极大的赞赏。

最佳答案

我不确定为什么要违背array[spot] = barray[spot] | mask;的直观概念,而且似乎使光点和 mask 的计算变得比必要的更为复杂。

为什么要使index < 8成为特殊情况?

if(index < 8)
    spot = 0;
...
else
    spot = index / 8;

在这两种情况下,index / 8都会为您提供正确的字节索引,对吗?

其次,以下任一行如何为您提供正确的位位置?你为什么要右移?发现(您必须访问的字节的索引)与字节中的位位置有什么关系?
mask = 1 >> index - 1;

mask = 1 << (index - (8*spot) - 1);

这是我未经测试的解决方案:
void BitArray::Set(unsigned int index)
{
    int spot = index / 8;
    char bit = 1 << (index % 8);
    barray[spot] = barray[spot] | bit;
}

关于c++ - C++使用char数组进行基础位存储/无法按位操作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8370757/

10-14 12:47
查看更多