条件语句如何与位的操作员一起使用
How does condition statement work with bit-wise 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;
}
我不明白的部分是条件如何工作。在这种情况下,如果i = 8,则在if语句中进行1000 & 1
,它应该退还1000等于8。
如果i = 7,则在if语句中应进行 111 & 1
,它给出111等于7
为什么如果(8)会返回"甚至",如果(7)返回"奇数"?我想我想了解IF语句正在检查是正确的,以及在与位的操作员打交道时是错误的。
当我写下这个问题时,一个想法是因为它实际上是在做
for 8: 1000 & 0001 which gives 0
for 7: 0111 & 0001 which gives 1?
是的,您在最后一部分。二进制&
和|
进行一点执行。因为
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
测试了1S位置中是否有1
,仅适用于奇数。
实际上,在C,C 和其他主要编程语言中,&
操作员在每个位中对整体类型中的AND
操作进行CC_9操作。当且仅当两个操作数的第n位等于1时,位于位AND
中的第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
。
if(x)
in C 将x
转换为布尔值。整数被认为是 true
iff,它是非零的。
因此,所有if(i & 1)
都在检查,以查看i
中是否设置了最不重要的位。如果设置了,则i&1
将是非零的;如果未设置,则i&1
为零。
整数IFF中设置的最低显着位是奇怪的,因此 i&1
iff i
是奇数的。
您所说的代码正在做的实际上是位于位的操作员应该如何工作。在您的示例中(8&amp; 1):
1000 & 0001 = 0000
因为在第一个值中,最后一个位设置为0,而在第二个值中,最后位设置为1。0&amp;1 = 0。
0111 & 0001 = 0001
在两个值中,最后位设置为1,因此结果为1,因为1&amp;1 =1。
表达式i & 1
,其中i
是int
,具有int
类型。它的值是1
或0
,具体取决于i
的低位值。在语句 if(i & 1)
中,该表达式的结果遵循整数类型的通常规则: 0
变为 false
,而非零为 true
。
- 如何将enable-if与模板参数和参数包一起使用
- 如何将PERF_AMPLE_READ与mmap一起使用
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 如何将C++中的库和头与MinGW一起使用
- 将--whole archive链接器选项与CMake和具有其他库依赖项的库一起使用
- 为什么我不能将 rand() 与数组的大小一起使用?
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 将fold表达式与std::一起用于两个元组
- spdlog标头仅与外部fmt一起使用.spdlog错误:'内部':不是'fmt'
- 什么是现实中的"endl"(或任何输出操纵器)?它是如何实现的,它如何与操作员<<一起工
- 逗号操作员如何与C 中的COUT一起使用
- 当直接分配时,为什么此功能指针分配起作用,而不是与有条件的操作员一起使用
- C 操作员超载将3个向量加在一起
- 为什么在C 中将任意数量的提前/减少操作员放在一起
- 如何与朋友操作员一起在链表下面工作
- 如何编写操作员==与隐式铸造/构造类型一起使用
- 条件语句如何与位的操作员一起使用
- 超载*操作员只能与一个施工人员一起工作
- 与"?:"操作员一起返回