【问题标题】:How does Unary Operator '&' work一元运算符“&”如何工作
【发布时间】:2016-10-05 13:25:24
【问题描述】:

一元运算符“&”是如何工作的?

在一个测试项目中,我运行了这段代码:

int num = 50, num2 = 100;

int x = num & num2;

结果:x = 32

 int num = 100, num2 = 90;

 int x = num & num2; 

结果:x = 64

这是如何计算的?

【问题讨论】:

  • 它不是一元运算符。至于它的作用,请阅读按位运算
  • 做一个简单的谷歌搜索应该会给你答案,它不是一元运算符,它是按位与
  • & 运算符有两个操作数。为什么说它是一元的?
  • @FᴀʀʜᴀɴAɴᴀᴍ msdn.microsoft.com/nl-be/library/sbf85k1c.aspx我从 MSDN 获得了一元。

标签: c#


【解决方案1】:

来自MSDN

二进制 & 运算符是为整数类型和 bool 预定义的。为了 整数类型, & 计算其操作数的逻辑按位与。 对于 bool 操作数, & 计算其操作数的逻辑与;那 也就是说,当且仅当它的两个操作数都为真时,结果才为真。

在您的情况下,它是整数类型版本。

所以:

 50 in binary is 00110010     
100 in binary is 01100100     
AND result is    00100000 (32 dec)

【讨论】:

    【解决方案2】:

    位运算符对位起作用并执行逐位运算。

    如果两个操作数中都存在二进制 AND 运算符,则将其复制到结果中。

    (A & B) = 12, i.e., 0000 1100
    

    【讨论】:

      【解决方案3】:

      二进制值

      50 (10 ) = 0110010  (2)
      100 (10) = 1100100  (2)
      

      并且使用了逻辑与,因此只有两个值都为 1 的位现在是一个,从而导致:

      0100000 (2) = 32 (10)
      

      100 (10) = 1100100  (2)
      AND
      90 (10) =  1011010 (2)
      ------------------------
      64 (10) =  1000000(2)
      

      【讨论】:

        【解决方案4】:

        第一件事:& 在这种情况下是一个 二元 运算符,因为它有 两个 参数。它不是 一元 运算符。

        & 有两个参数是按位与运算符。

        50 & 1000b110010 & 0b1100100。将& 应用到每个位会得到0b100000,即32。

        您可以类似地分析100 & 90

        【讨论】:

          【解决方案5】:

          将两个数字表示为二进制(以便在进行 bitwise 操作时清楚地看到 bits)并看看发生了什么:

          private static String AndExplanation(int left, int right) {
            String x = Convert.ToString(left, 2);
            String y = Convert.ToString(right, 2);
            String z = Convert.ToString(left & right, 2);
          
            int length = Math.Max(x.Length, y.Length);
          
            return String.Join(Environment.NewLine,
              $"{x.PadLeft(length, '0')} ({left}) &",
              $"{y.PadLeft(length, '0')} ({right})",
              new String('-', length),
              $"{z.PadLeft(length, '0')} ({left & right})"
            );
          }
          

          测试

          Console.Write(AndExplanation(50, 100));
          
          Console.Write(AndExplanation(90, 100));
          

          你会看到:

          0110010 (50) &
          1100100 (100)
          -------
          0100000 (32)
          

          1011010 (90) &
          1100100 (100)
          -------
          1000000 (64)
          

          【讨论】:

            【解决方案6】:

            简短的回答是 - 视情况而定。

            对于整数,就像您的情况一样,它会进行位操作。所以01100100 (100) 按位与 00110010 (50) = 00100000 (32)。

            对于布尔值,它是一个急切的 AND(总是计算两个表达式) - 与惰性 AND && 不同,如果第一个表达式是 false,它不会计算第二个表达式。

            【讨论】:

              【解决方案7】:

              这是一个按位与:

              在“0b0110010 AND 0b1100100”中,您应该查找在公共位置共享的 1 和 0,即 0b0100000=32。

              同样适用于“100 AND 90”,得到 0b1000000=64。

              希望对你有所帮助。

              【讨论】:

                【解决方案8】:

                这是一个位运算符。 50 的位(二进制)是 110010,100 是 1100100,当你对齐它们(向右对齐)时,你会得到 110010 1100100

                & 运算符的工作方式是,在每个位置,如果两条线都为 1,则为 1,否则为 0,如下所示。 110010 1100100 ||||||| 0100000 所以你得到二进制结果 100000,即 32。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2017-04-09
                  • 2018-08-31
                  • 2010-10-02
                  • 2013-07-12
                  • 2018-06-08
                  • 2020-01-29
                  • 2011-02-26
                  相关资源
                  最近更新 更多