Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;将字符数组用于底层位存储/can';不能让按位运算工作_C++_Arrays_Char_Bits - Fatal编程技术网

C++ C++;将字符数组用于底层位存储/can';不能让按位运算工作

C++ C++;将字符数组用于底层位存储/can';不能让按位运算工作,c++,arrays,char,bits,C++,Arrays,Char,Bits,因此,我有一个无符号字符数组,目前我正在尝试编写一个Set方法(将给定索引中的位更改为1)。我能想到的最好的方法是,不为整个数组创建掩码,我只创建一个字节大小的掩码,并且只使用用户想要更改的给定位来屏蔽数组中的索引点。然而,无论我如何尝试,要么在使用位索引为1的所有0的掩码对结果数组进行屏蔽后,结果数组没有任何变化,要么我得到一个seg错误。我所能做的最好的事情就是更改第一个数组索引中的正确位。我的代码目前是如何设置的现在我明白了为什么它只更改数组第一个字节中的正确位,但每次尝试更改都失败了,我

因此,我有一个无符号字符数组,目前我正在尝试编写一个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说,“一些运算符(一元运算符
~
,二元运算符
&
^
,统称为位运算符)必须具有整数类型的操作数。这些运算符生成的值取决于整数的内部表示形式,并且有符号类型具有实现定义和未定义的方面。”对有符号类型的一些操作定义得很好,但我发现仅仅使用无符号类型要比记住哪些情况是安全的容易得多。