【问题标题】:What does this statement mean in C#?这个语句在 C# 中是什么意思?
【发布时间】:2013-04-17 15:00:46
【问题描述】:

下面代码块中的if ((a & b) == b)是什么意思?

if ((e.Modifiers & Keys.Shift) == Keys.Shift)
{
    lbl.Text += "\n" + "Shift was held down.";
}

为什么不是这样?

if (e.Modifiers == Keys.Shift)
{
    lbl.Text += "\n" + "Shift was held down.";
}

【问题讨论】:

标签: c# if-statement


【解决方案1】:

如果你看一下Keys enum,这是flag enum,带有[FlagsAttribute] 属性。

仅当要对数值执行按位运算(AND、OR、EXCLUSIVE OR)时,才对枚举使用 FlagsAttribute 自定义属性。

以 2 的幂定义枚举常数,即 1、2、4、8 等。这意味着组合枚举常量中的各个标志不会重叠。

所以e.Modifiers 可能是多个枚举的组合:

e.Modifiers = Keys.Shift | Keys.Cancel | Keys.Enter

只是非常简单的假设来解释这个概念:

Keys.Shift  : 001 (1)
Keys.Cancel : 010 (2)
Keys.Enter  : 100 (4)

所以:

e.Modifiers = Keys.Shift | Keys.Cancel | Keys.Enter equal 001 | 010 | 100 = 111

还有条件:

    e.Modifiers & Keys.Shift equal 111 & 001 = 001

意思是:

 e.Modifiers & Keys.Shift == Keys.Shift

如果e.Modifiers 不包含Keys.Shift

e.Modifiers = Keys.Cancel | Keys.Enter (110)

所以结果会是:

e.Modifiers & Keys.Shift equals 110 & 001 = 000 (is not Keys.Shift)

总结起来,这个条件检查e.Modifiers是否包含Keys.Shift

【讨论】:

    【解决方案2】:

    这是布尔逻辑(& = “按位与”)。您检查变量是否包含值。这就像一个过滤器。

    示例:

    a   -> 00110011
    b   -> 00000011
    a&b -> 00000011
    

    在你的代码中

    if ((e.Modifiers & Keys.Shift) == Keys.Shift)
    

    检查 Keys.Shift 是否包含在 e.Modifiers 中。

    【讨论】:

      【解决方案3】:

      单个 & 符号指的是 bitwise AND operator。当与具有[Flags] 属性的枚举结合使用时,Keys 枚举确实如此,它用于确定该枚举的某个位是否已设置。

      可能同时按下多个修饰键,因此使用它而不是直接比较。

      您可以阅读有关枚举标志 here 的更多信息。向下滚动到标题为“作为位标志的枚举类型”的小节。您会看到一个与此非常相似的示例。

      【讨论】:

        【解决方案4】:

        一个与号 (&) 是按位与,所以它基本上是将 (a & b) 的值相加,然后测试 (a & b) == b 中的相等性

        因此,在您的示例中,基本上是说是否按下了 shift 键(任意键 + shift)== shift。

        【讨论】:

        • 不是添加它们!应用按位 AND 运算符和相加之间存在巨大的区别。
        • 是的,我意识到了这一点。我只是想用一种简单的方式来解释它。很抱歉冒犯了。
        【解决方案5】:

        它使用按位运算来查询是否设置了“标志”(位)(等于 1)。

        最好在http://msdn.microsoft.com/en-us/library/vstudio/cc138362.aspx阅读枚举和按位运算

        【讨论】:

          【解决方案6】:

          & 是按位与运算符。它所做的是Keys 是一个标志枚举,Keys 中的值可以是多个值的按位组合。因此,要测试任何特定值,您首先将您的值与您要测试的值相比较,然后将其与您要测试的值进行比较。

          例如,您可能同时按住 shift 和 ctrl 键,因此 e.Modifier 中的值将是 Keys.ShiftKeys.Ctrl 的按位组合。所以这个:

          e.Modifier == Keys.Shift
          

          是假的。 Shift 被按住,但 Ctrl 也被按住。如果您想知道 Shift 是否被按住而不管其他键可能被按住,您需要首先过滤掉所有其他键。这可以通过使用Keys.Shift 作为过滤器轻松完成:

          (e.Modifier & Keys.Shift) == Keys.Shift
          

          现在如果按住 shift 键则为真无论其他键可能被按下,否则为假。

          【讨论】:

            【解决方案7】:

            第 1 部分

            这是逻辑与运算符。

            当多个标志应该设置在一个中时使用它,例如整数:

            a 例如是 3,这意味着二进制表示法中的 00000011。 b 例如是 2,表示二进制的 00000010。

            当您想检查 a 是否具有 b 表示设置的标志(右起第二位)时,您使用 AND 运算符:

            a & b = 00000010

            当 this 等于 b(或大于 0)时,您知道标志已设置。

            第 2 部分

            等号运算符也可用于您要检查“Keys.Shift”是否是唯一的“修饰符”键并且没有按下其他键的情况。当您使用第一个代码时,也可以按下其他“修饰符”键,并且 if 条件仍然为真。

            【讨论】:

              【解决方案8】:

              单个与号 (&) 执行按位与运算;双与号 (&&) 执行布尔 AND 运算。

              按位对两个参数的每一位执行 AND 运算(因此称为“按位”)。因此,按位与运算(或任何按位运算)的输出将不是布尔值。以下是按位与运算的一些示例:

              1001 & 0001 = 0001
              1101 & 1111 = 1101
              

              布尔 AND 对两个布尔值进行运算并返回一个布尔值:

              true && true = true
              false && true = false
              

              短路
              也可以对两个返回布尔值的表达式执行布尔 AND 运算 (&&):

              int a = 5;
              int b = 10;
              bool result = (a < 3) && (b > 3);
              // result will be false;
              

              因为第一个表达式(a &lt; 3) 的计算结果为false,所以结果不可能是true,因为两个表达式都必须计算为true 才能使结果为true。因此,甚至不会计算第二个表达式。这称为“短路”。但是,对于按位与运算,两个表达式都需要在执行运算之前进行计算。因此,在大多数情况下,您只想确定两件事是否为真(布尔值),布尔值 AND (&&) 将是最佳选择。

              在您的示例中,代码将e.Modifiers 中的各个位与Keys.Shift 中的各个位进行比较。两个参数都不代表布尔值,因此操作是按位 (&) 而不是布尔值 (&&)。

              【讨论】:

                猜你喜欢
                • 2012-01-05
                • 1970-01-01
                • 2022-01-12
                • 2016-07-04
                • 1970-01-01
                • 2021-12-25
                • 2014-03-30
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多