C++ 条件语句如何使用位运算符?
我试图理解if条件如何与位运算符一起工作。 检查数字是偶数还是奇数的方法可以通过以下方式完成: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
#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