2012-02-19 41 views
-4

我玩弄试图得到它的正确理解位,我碰到这个问题来了。我将char中的第六位设置为1,我试图找出它是否被设置为1.它给我一个错误的答案。位操作

int main(int argc, char** argv) { 
    unsigned char a=0; 
    a=a | (1<<6); 
    int b=a &(1<<6); 
    cout<< b; 
    return 0; 
} 

它给我的结果是64而不是1.为什么?

+5

为什么它应该给你1?在你的脑海里,你觉得'&'做什么? – 2012-02-19 23:33:08

+0

你做错了。 2^6 = 64 – UmNyobe 2012-02-19 23:34:58

+0

谢谢看到我的错误 – 2012-02-19 23:46:24

回答

1

这确实是正确的和预期的行为。

检查位n是否被设置的方法是这样的:

return (value & (1U << n)) == (1U << n); 

&执行按位 AND,所以11111111 & 0100000001000000

0

您可以使用:

int b = (a >> 6) & 1; 

b== 1如果第六位设置和0如果事实并非如此。

0

程序的预期输出是64,因为64&64是64.由于非零值被解释为真在if表达式和条件运算符(&&||),这对很多情况下不够好:

a |= (1<<6); 
if (a & (1<<6)) 
{ 
    /* this code would get executed */ 
} 

如果你通过在你的变量64S困扰,然后再尝试这样的事:

bool b = (a & (1<<6)) ? true : false; 

我如果在这里需要三元运算符不知道,但就是非常清楚发生了什么事情。

或者你很可能做到这一点:

bool b = a >> 6 & 1;