因此,我有一个无符号字符数组,当前我正在尝试编写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/