【问题标题】:How does condition statement work with bit-wise operators?条件语句如何与位运算符一起使用?
【发布时间】:2012-10-24 17:21:15
【问题描述】:

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

我不明白的部分是 if 条件如何工作。在这种情况下,如果 i = 8,那么 in If 语句正在执行 1000 &amp; 1,它应该返回等于 8 的 1000。

如果 i = 7,那么在 if 语句中它应该执行111 &amp; 1,它返回等于 7 的 111

为什么 if(8) 会返回“偶数”而 if(7) 会返回“奇数”?我想我想了解 if 语句在处理按位运算符时检查的是什么为真,什么是假的。

当我写下这个问题时只是一个想法是因为它实际上正在做

for 8: 1000 & 0001 which gives 0
for 7: 0111 & 0001 which gives 1?

【问题讨论】:

  • 您对x &amp; y 返回的内容的假设是错误的。
  • "在处理按位运算符时,if 语句检查什么为真,什么为假。" - 条件检查只关心最终结果,而不关心它是如何计算的。
  • @Cubic:我向你保证,在任何系统上都没有十进制 8 表示为 1111101000。在几乎所有系统上,它都是 00001000。
  • @MooingDuck 我得到了你在拖钓的明显印象。这不是你第一次以完全荒谬的方式回复我的评论了。
  • @MooingDuck 他大概的意思是数字一千(十进制的1000)是二进制的1111101000。

标签: c++ bitwise-operators


【解决方案1】:

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

1 & 1 == 1
1 & 0 == 0
0 & 1 == 0
0 & 0 == 0

我们可以看到:

8 & 1 == 1000 & 0001 == 0000

7 & 1 == 0111 & 0001 == 0001

您的test 函数确实可以正确计算一个数字是偶数还是奇数,因为a &amp; 1 测试在1 的位置是否有一个1,它只用于奇数。

【讨论】:

  • 这里没什么好说的了 :) 也许加上 1 & 0 = 0, 1 & 1 = 1 和 0 & 1 = 0
【解决方案2】:

实际上,在 C、C++ 和其他主要编程语言中,&amp; 运算符在整数类型的每个位中执行 AND 操作。当且仅当两个操作数的第 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

【讨论】:

    【解决方案3】:

    C++ 中的if(x)x 转换为布尔值。一个整数被认为是true 如果它是非零的。

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

    如果整数是奇数,则在整数中设置最低有效位,因此如果i 是奇数,则i&amp;1 是非零的。

    【讨论】:

    • 不过这是 C++。 true 为真,false 为假,只是整数和指针仍可隐式转换为 bool
    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      您所说的代码实际上是按位运算符应该如何工作。在您的 (8 & 1) 示例中:

      1000 & 0001 = 0000
      

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

      0111 & 0001 = 0001
      

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

      【讨论】:

        猜你喜欢
        • 2012-04-19
        • 2023-04-05
        • 2019-11-14
        • 2016-06-28
        • 2013-04-21
        • 1970-01-01
        • 2020-04-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多