条件语句如何与逐位运算符一起使用?

时间:2012-10-24 17:21:16

标签: c++ bitwise-operators

我试图了解条件如何使用按位运算符。 检查数字是偶数还是奇数的方法可以通过以下方式完成:

#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?

5 个答案:

答案 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)

C ++中的

if(x)x转换为布尔值。如果整数非零,则将其视为true

因此,所有if(i & 1)正在检查是否在i中设置了最低有效位。如果已设置,i&1将为非零;如果未设置,i&1将为零。

如果整数是奇数,则最低有效位设置为整数if,因此如果i&1为奇数,则i为非零。

答案 3 :(得分:2)

表达式i & 1,其中iint,类型为int。其值为10,具体取决于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。