C++ C++;将字符数组用于底层位存储/can';不能让按位运算工作
因此,我有一个无符号字符数组,目前我正在尝试编写一个Set方法(将给定索引中的位更改为1)。我能想到的最好的方法是,不为整个数组创建掩码,我只创建一个字节大小的掩码,并且只使用用户想要更改的给定位来屏蔽数组中的索引点。然而,无论我如何尝试,要么在使用位索引为1的所有0的掩码对结果数组进行屏蔽后,结果数组没有任何变化,要么我得到一个seg错误。我所能做的最好的事情就是更改第一个数组索引中的正确位。我的代码目前是如何设置的现在我明白了为什么它只更改数组第一个字节中的正确位,但每次尝试更改都失败了,我不认为这应该很难,我只是觉得我遗漏了一些东西,但阅读页面和谷歌搜索让我无所适从。这是我的代码的一个狙击手现在C++ C++;将字符数组用于底层位存储/can';不能让按位运算工作,c++,arrays,char,bits,C++,Arrays,Char,Bits,因此,我有一个无符号字符数组,目前我正在尝试编写一个Set方法(将给定索引中的位更改为1)。我能想到的最好的方法是,不为整个数组创建掩码,我只创建一个字节大小的掩码,并且只使用用户想要更改的给定位来屏蔽数组中的索引点。然而,无论我如何尝试,要么在使用位索引为1的所有0的掩码对结果数组进行屏蔽后,结果数组没有任何变化,要么我得到一个seg错误。我所能做的最好的事情就是更改第一个数组索引中的正确位。我的代码目前是如何设置的现在我明白了为什么它只更改数组第一个字节中的正确位,但每次尝试更改都失败了,我
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 }
void BitArray::Set(无符号整数索引)
70 {
71 int spot;//barray中的索引,其中
72//要设置的位位于
73个字符掩码;
74如果(指数<8)
75 {
76点=0;
77掩码=1>>索引-1;
78 }
79其他
80 {
81点积分=指数/8;
82 mask=1可能问题出在barray
?
无论如何,此代码应该可以工作:
void BitArray::Set (unsigned int index)
{
//assert(index / 8 < arraySize);
static const unsigned char masks[8] = {1, 2, 4, 8, 16, 32, 64, 128};
barray[index / 8] |= masks[index % 8];
}
也许问题出在barray
?
无论如何,此代码应该可以工作:
void BitArray::Set (unsigned int index)
{
//assert(index / 8 < arraySize);
static const unsigned char masks[8] = {1, 2, 4, 8, 16, 32, 64, 128};
barray[index / 8] |= masks[index % 8];
}
我不知道你为什么要违背你的直觉,即array[spot]=barray[spot]|mask;
,而且你似乎让spot和mask的计算变得比必要的更复杂
你为什么把索引<8
作为一个特例
if(index < 8)
spot = 0;
...
else
spot = index / 8;
以下是我未经测试的解决方案:
void BitArray::Set(unsigned int index)
{
int spot = index / 8;
char bit = 1 << (index % 8);
barray[spot] = barray[spot] | bit;
}
void BitArray::Set(无符号整数索引)
{
int spot=指数/8;
char bit=1我不知道为什么你违背了你的直觉概念,数组[spot]=barray[spot]|mask;
,而且你似乎让spot和mask的计算变得比必要的更复杂
你为什么把索引<8
作为一个特例
if(index < 8)
spot = 0;
...
else
spot = index / 8;
以下是我未经测试的解决方案:
void BitArray::Set(unsigned int index)
{
int spot = index / 8;
char bit = 1 << (index % 8);
barray[spot] = barray[spot] | bit;
}
void BitArray::Set(无符号整数索引)
{
int spot=指数/8;
char bit=1不使用向量
或位集
的任何原因?对于初学者,如果使用位运算符,几乎肯定应该使用无符号类型。@KeithThompson,位运算忽略sign@Abyx:不一定。例如,负值的移位要么是实现定义的,要么是未定义的。@Abyx:6.5p4说,“一些运算符(一元运算符~
,以及二进制运算符
,&
,^
和|
,统称为位运算符)必须具有整数类型的操作数。这些运算符生成的值取决于整数的内部表示形式,并且有符号类型具有实现定义和未定义的方面。”对有符号类型的一些操作定义得很好,但我发现仅仅使用无符号类型要比记住哪些情况是安全的容易得多。您不使用vector
或bitset
的原因是什么?对于初学者来说,如果您使用的是位运算符,您几乎肯定应该使用无符号类型。@KeithThompson,按位操作I侏儒sign@Abyx:不一定。例如,负值的移位要么是实现定义的,要么是未定义的。@Abyx:6.5p4说,“一些运算符(一元运算符~
,二元运算符
,&
,^
和
,统称为位运算符)必须具有整数类型的操作数。这些运算符生成的值取决于整数的内部表示形式,并且有符号类型具有实现定义和未定义的方面。”对有符号类型的一些操作定义得很好,但我发现仅仅使用无符号类型要比记住哪些情况是安全的容易得多。