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

10

我尝试理解条件语句与位运算符的工作原理。 通过以下方式可以检查一个数字是偶数还是奇数:

#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 语句在处理位运算符时检查真假的条件。
当我写下这个问题时,我想到它是否因为它实际上正在执行
for 8: 1000 & 0001 which gives 0
for 7: 0111 & 0001 which gives 1?

6
你对于 x & y 返回结果的假设是错误的。 - chris
& 是按位与运算符。1000 表示为 1111101000,而 1 表示为 1。1111101000 & 1 等于 0,因此是 false。 - Cubic
3
我向您保证,在任何系统中,十进制的8都不会被表示为1111101000。在几乎所有系统中,它的表示方式是00001000。 - Mooing Duck
1
@MooingDuck 我很明显感觉到你在恶意挑衅。这不是你第一次以毫无意义的方式回复我的评论了。 - Cubic
2
@MooingDuck 他可能是指十进制中的一千(1000)在二进制中表示为1111101000。 - fredoverflow
显示剩余3条评论
5个回答

20

是的,你在最后一部分说得对。二进制中的 &| 操作是按位进行的。因为

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的位数是否存在,这只存在于奇数中。


1
也许可以补充一下,1和0的按位与运算结果为0,1和1的按位与运算结果为1,0和1的按位与运算结果为0。 - count0

6
实际上,在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

因此,对于一个偶数和1进行按位AND操作将始终等于0,因为只有奇数的最低有效位等于1


3

您所说的代码实际上就是按位运算符应该执行的方式。以 (8 & 1) 为例:

1000 & 0001 = 0000

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

0111 & 0001 = 0001

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


3
在C++中,if(x)x转换为布尔值。如果一个整数不为零,则被认为是true
因此,所有if(i & 1)所做的就是检查i中的最低位是否设置。如果设置了,i&1将不为零;如果未设置,则i&1将为零。
如果一个整数为奇数,则该整数的最低有效位设置,因此i&1是非零的当且仅当i是奇数。

1
这是C ++。true是真实的,false是假的,只是整数和指针仍然可以隐式转换为bool - Cubic

2
表达式i & 1,其中i是一个int类型的变量,其类型为int。它的值为10,取决于i的最低位的值。在语句if(i & 1)中,该表达式的结果会被转换为bool类型,遵循整数类型的通常规则:0变为false,非零变为true。请保留HTML标签。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接