我玩弄试图得到它的正确理解位,我碰到这个问题来了。我将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.为什么?
我玩弄试图得到它的正确理解位,我碰到这个问题来了。我将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.为什么?
这确实是正确的和预期的行为。
检查位n
是否被设置的方法是这样的:
return (value & (1U << n)) == (1U << n);
的&
执行按位 AND,所以11111111 & 01000000
是01000000
。
您可以使用:
int b = (a >> 6) & 1;
b
将== 1
如果第六位设置和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;
为什么它应该给你1?在你的脑海里,你觉得'&'做什么? – 2012-02-19 23:33:08
你做错了。 2^6 = 64 – UmNyobe 2012-02-19 23:34:58
谢谢看到我的错误 – 2012-02-19 23:46:24