error:expression必须具有指向对象的指针类型

时间:2014-01-29 03:31:04

标签: c++

我尝试设计一个程序,该程序将返回原始的32位值w,但将数字i元素更改为1。这是我到目前为止的功能。但对于这部分v[i]=1;,它只是说i表达式必须有指向对象类型的指针。

 unsigned int setBit(unsigned int w,unsigned int i)
 {
    unsigned int v = w;
    v[i]=1;
    return v;
 }

3 个答案:

答案 0 :(得分:2)

unsigned int v = w;
v[i] = 1; // error, v is not an array

这是不正确的,因为v不是数组。解决方案可能是使用std::bitset或简单地移位和使用一些位操作 - 这会更快。

unsigned int setBit(unsigned int w,unsigned int i) {
    unsigned int v = ( w |= 1 << i);
    return v;
}

用法:

int main(int argc, char *argv[])
{
    unsigned int in = 0;
    unsigned int res = setBit(in,1); // set 1st bit in 0 to 1, results in 2
    return 0;
}

unsigned int v = ( w |= 1 << i);

的含义

| - the bitwise OR

&LT;&LT; - the bitwise shift

v = ( w |= 1 << i)v = ( w = w | 1 << i)相同,因此意味着:v等于(wOR1移至i,并将其分配给w

about C/C++ bit manipulation

答案 1 :(得分:0)

在C ++中,[]运算符用于string/array/vector/map/...,但不适用于unsigned int

对于您的示例,您可能需要先将其更改为bit array以便能够以这种方式使用。

答案 2 :(得分:0)

如果您有兴趣。

unsigned int setBit(unsigned int w, unsigned int i)
{
  std::bitset<sizeof(unsigned int)> bitset((unsigned long long)w);
  bs.set(i, 1);
  (unsigned int)return bs.to_ulong();
}

虽然我仍然会使用piotrus'答案。