#include <iostream>
int main(int argc, char* argv[])
{
unsigned long mask = 0x00000001;
unsigned long mask1 = 0x00000001;
unsigned long mask2 = 0x00000010;
if ((mask and mask1) && (mask and mask2))// CONDITION_1 is True.
std::cout << "Ohhhhhhh..." << std::endl;
if ((mask & mask1) && (mask & mask2)) //CONDITION_2 is False.
std::cout << "No Output..." << std::endl;
return 0;
}
我认为CONDITION_1和CONDITION_2都是假的,但我的想法显然是错误的,为什么'和'和'&amp;'在C ++中是不一样的?
答案 0 :(得分:12)
and
和&&
是相同的。这是合乎逻辑的。 &
是按位和。
答案 1 :(得分:5)
and
或&&
是逻辑AND运算符。如果两个操作数都转换为true
,则会产生true
。
bitand
或&
是按位AND运算符。如果设置了两个操作数的相应位,则设置结果的每个位。
答案 2 :(得分:1)
单个&符号是按位的,而'和'关键字是&amp;&amp;&amp;&amp;&amp;&amp;&amp;&amp ;,
答案 3 :(得分:1)
&&
和and
都是逻辑 and
运算符,而&
是按位 {{1运营商。
所以
and
相当于
(mask and mask1) && (mask and mask2)
答案 4 :(得分:1)
C / C ++中的2“和”运算符是&amp;&amp; (逻辑和)和&amp; (按位和)。
&安培;&安培;如果两个参数都为非零(true),则返回布尔结果(true / false,1/0),否则返回false。这用于确定2个布尔条件是否为BOTH为真。
&安培;将返回两个参数中任何位set(1)的整数。所以0b10101010&amp; 0b11110000将产生0b10100000。这对于检查标志或位掩码的任何其他用途非常有用(特别是在嵌入式世界中,您可以使用单个位而不是标志的完整字节/字/双字。)
编辑:学习了一些新内容并删除了错误的陈述。
答案 5 :(得分:0)
AND
是逻辑短路&&
,而&
是按位运算符,处理单个位。
当使用逻辑运算符时,C ++仅评估从左到右的必要条件,以得出组合的关系结果,忽略其余的结果。
按位运算符根据表示存储值的位模式修改变量。
答案 6 :(得分:0)
&
是二进制AND
运算符。
此运算符的结果只有两个参数中设置为1
的{{1}}位。
1
的结果:
((mask and mask1) && (mask and mask2)
== mask and mask1
(== true
)mask && mask1
== mask and mask2
(== true
)mask && mask2
== (true) && (true)
true
的结果:
(mask & mask1) && (mask & mask2)
== mask & mask1
(因为两个案例中最低有效位均为1)0x00000001
== mask & mask2
(掩码中1的位在mask2中为0,反之亦然)0x00000000
== false 答案 7 :(得分:0)
AND相当于&amp;&amp;被视为逻辑运算符。并且&amp;是按位运算符。
按位AND(&amp;)
按位AND运算符是单个&符号:&amp ;.一个方便的助记符是布尔AND和&amp;&amp;的小版本适用于较小的部分(比特而不是字节,字符,整数等)。本质上,二进制AND只是以二进制形式获取数字每个位置的位的逻辑AND。
例如,使用字节(char类型):
01001000
&
10111000
--------
00001000
第一个数字的最高有效位为0,因此我们知道结果的最高有效位必须为0;在第二个最高有效位中,第二个数字的位为零,因此我们得到相同的结果。两个位都是1的唯一时间,即结果为1的唯一时间,是左起第五位。因此,
72&amp; 184 = 8
逻辑AND(&amp;&amp;) 逻辑AND运算符用于测试两个条件是否都为真。如果两个条件都为真,则逻辑AND返回true。否则,它返回false。