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

use*_*072 6 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;
}
Run Code Online (Sandbox Code Playgroud)

第一部分我不明白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?
Run Code Online (Sandbox Code Playgroud)

Xym*_*ech 16

是的,你在最后一部分是正确的.二进制&|逐位执行.以来

1 & 1 == 1
1 & 0 == 0
0 & 1 == 0
0 & 0 == 0
Run Code Online (Sandbox Code Playgroud)

我们可以看到:

8 & 1 == 1000 & 0001 == 0000
Run Code Online (Sandbox Code Playgroud)

7 & 1 == 0111 & 0001 == 0001
Run Code Online (Sandbox Code Playgroud)

你的test函数可以正确计算一个数字是偶数还是奇数,因为a & 1测试11s中是否有a ,只有奇数.


Mur*_*los 6

实际上,在C、C++等主流编程语言中,运算符对整型的每一位&进行运算。AND当且仅当两个操作数的第 n 位都AND等于 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
Run Code Online (Sandbox Code Playgroud)

因此,AND在偶数 和 之间按位进行运算1将始终相等,0因为只有奇数的最低有效位等于1