我试图了解条件如何使用按位运算符。 检查数字是偶数还是奇数的方法可以通过以下方式完成:
#include <iostream>
#include <string>
using namespace std;
string test()
{
int i = 8; //a number
if(i & 1)
return "odd";
else
return "even";
}
int main ()
{
cout << test();
return 0;
}
我不明白的部分是if条件是如何工作的。在这种情况下,如果i = 8,则在if语句中它正在执行1000 & 1
,它应该返回1000等于8。
如果i = 7,那么在if语句中它应该是111 & 1
,它返回111等于7
为什么if(8)将返回“even”并且if(7)返回“odd”?我想我想要理解if语句检查为True是什么以及在处理逐位运算符时应该是什么。
只是当我把这个问题写下来时,这是因为它实际上是在做
for 8: 1000 & 0001 which gives 0
for 7: 0111 & 0001 which gives 1?
答案 0 :(得分:16)
是的,你在最后一部分是正确的。二进制&
和|
是逐位执行的。由于
1 & 1 == 1
1 & 0 == 0
0 & 1 == 0
0 & 0 == 0
我们可以看到:
8 & 1 == 1000 & 0001 == 0000
和
7 & 1 == 0111 & 0001 == 0001
您的test
函数可以正确计算数字是偶数还是奇数,因为a & 1
会测试1s中是否有1
,只有奇数
答案 1 :(得分:4)
实际上,在C,C ++和其他主要编程语言中,&
运算符在每个位中对整数类型执行AND
次运算。当且仅当两个操作数的第n位等于1时,按位AND
中的第n位等于1.
例如:
8 & 1 =
1000 - 8
0001 - 1
----
0000 - 0
7 & 1 =
0111 - 7
0001 - 1
----
0001 - 1
7 & 5 =
0111 - 7
0101 - 5
----
0101 - 5
因此,在偶数和AND
之间执行按位1
始终等于0
,因为只有奇数的最低有效位等于1
。
答案 2 :(得分:3)
if(x)
将x
转换为布尔值。如果整数非零,则将其视为true
。
因此,所有if(i & 1)
正在检查是否在i
中设置了最低有效位。如果已设置,i&1
将为非零;如果未设置,i&1
将为零。
如果整数是奇数,则最低有效位设置为整数if,因此如果i&1
为奇数,则i
为非零。
答案 3 :(得分:2)
表达式i & 1
,其中i
是int
,类型为int
。其值为1
或0
,具体取决于i
的低位值。在语句if(i & 1)
中,该表达式的结果将转换为bool
,遵循通常的整数类型规则:0
变为false
,非零变为{{1} }}
答案 4 :(得分:2)
你所说的代码实际上是按位运算符应该如何工作的。在您的(8&amp; 1)示例中:
1000 & 0001 = 0000
因为在第一个值中,最后一位设置为0,而在第二个值中,最后一位设置为1. 0&amp; 1 = 0。
0111 & 0001 = 0001
在两个值中,最后一位设置为1,因此结果为1,因为1&amp; 1 = 1。