2014-01-29 120 views
0

我试图设计一个程序,它将返回原始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; 
} 

回答

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

< < - the bitwise shift

v = (w |= 1 << i)相同v = (w = w | 1 << i)所以这意味着:v等于(采取wOR它与1向左i偏移,并且分配此给w

about C/C++ bit manipulation

+0

“| =”是什么意思?和它背后的“<<”。我真的只是C++的初学者。谢谢 – SYM2RR

+0

| =是|的精简版和=,意思是“w | = 1”与w = w |意思相同1'。就像+ =。 –

0

在C++中,操作者[]string/array/vector/map/...,但不是一个unsigned int

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

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的答案。

相关问题