6

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

#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,那么它正在执行的 in If 语句1000 & 1应该返回等于 8 的 1000。

如果 i = 7,那么在 if 语句中它应该111 & 1返回 111,它等于 7

为什么 if(8) 将返回“偶数”而 if(7) 返回“奇数”?我想我想了解在处理按位运算符时 if 语句正在检查什么是 True 以及什么是 False 。

当我写下这个问题时只是一个想法是因为它实际上在做

for 8: 1000 & 0001 which gives 0
for 7: 0111 & 0001 which gives 1?
4

5 回答 5

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测试 1 的位置是否有 a 1,只有奇数才有。

于 2012-10-24T17:24:08.337 回答
4

实际上,在 C、C++ 和其他主要编程语言中,&运算符AND在整数类型的每个位上进行操作。AND当且仅当两个操作数的第 n 位都等于 1 时,按位中的第 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

于 2012-10-24T17:29:00.123 回答
3

if(x)在 C++ 中转换x为布尔值。一个整数被认为true是非零的。

因此,if(i & 1)所做的只是检查是否设置了最低有效位i。如果已设置,则为i&1非零;如果未设置,i&1则为零。

如果该整数是奇数,则在整数中设置最低有效位,因此如果是奇数,i&1则非零i

于 2012-10-24T17:25:16.773 回答
2

表达式i & 1where iis anint具有类型int。它的值为10,取决于 的低位的值i。在语句if(i & 1)中,该表达式的结果被转换为bool,遵循整数类型的通常规则:0变为false,非零变为true

于 2012-10-24T17:24:55.327 回答
2

您所说的代码实际上是按位运算符应该如何工作。在您的 (8 & 1) 示例中:

1000 & 0001 = 0000

因为在第一个值中,最后一位设置为 0,而在第二个值中,最后一位设置为 1. 0 & 1 = 0。

0111 & 0001 = 0001

在这两个值中,最后一位都设置为 1,因此结果为 1,因为 1 & 1 = 1。

于 2012-10-24T17:25:01.210 回答