Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 条件语句如何使用位运算符?_C++_Bitwise Operators - Fatal编程技术网

C++ 条件语句如何使用位运算符?

C++ 条件语句如何使用位运算符?,c++,bitwise-operators,C++,Bitwise Operators,我试图理解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

我试图理解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;
}

是的,你在最后一部分是对的。二进制
&
|
逐位执行。自

1 & 1 == 1
1 & 0 == 0
0 & 1 == 0
0 & 0 == 0
我们可以看到:

8 & 1 == 1000 & 0001 == 0000


您的
test
函数确实正确地计算了一个数字是偶数还是奇数,因为
a&1
测试1s中是否有
1
,而1s中只有奇数。

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

,您所说的代码实际上是按位运算符的工作方式来执行的。在(8和1)的示例中:

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

0111 & 0001 = 0001

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

< P> <代码>(x)< /C> >在C++中转换<代码> x<代码>为布尔。如果整数为非零,则将其视为
true

因此,
if(i&1)
所做的一切就是检查
i
中是否设置了最低有效位。如果设置,
i&1
将不为零;如果未设置,
i&1
将为零


最低有效位是整数,如果整数为奇数,因此<代码> I和1 非零IFF<代码> I <代码>为奇数。

< P>实际上,在C、C++和其他主要编程语言中,<代码>和<代码>操作符在每一个比特上都做了代码>和<代码>操作,以获得积分类型。按位
中的第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
之间按位执行
操作将始终等于
0
,因为只有奇数的最低有效位等于
1

您关于
x&y
返回值的假设是错误的。“在处理位运算符时,if语句将检查哪些内容为真,哪些内容为假。“-条件检查只关心最终结果,而不关心它是如何计算的。@Cubic:我向您保证,在任何系统上,十进制8都不能表示为11111 01000。”。在几乎所有的系统上,它都是000011000。@MooingDuck我能清楚地感觉到你在跟踪。这不是你第一次用一种完全荒谬的方式回答我的评论。“MooingDuck,他可能意味着第一千个数字(1000个十进制)是二进制的11111个01000。这里没有更多的话可以说:)也许加上1和0=0, 1和1=1和0和1=0。C++是。code>true
为true,
false
为false,只是整数和指针仍然可以隐式转换为
bool
1000 & 0001 = 0000
0111 & 0001 = 0001
8 & 1 =
1000 - 8
0001 - 1
----
0000 - 0

7 & 1 =
0111 - 7
0001 - 1
----
0001 - 1

7 & 5 =
0111 - 7
0101 - 5
----
0101 - 5