【问题标题】:Use of Bitwise AND (&) in this scenario在这种情况下使用按位与 (&)
【发布时间】:2015-06-03 09:42:45
【问题描述】:

我已经在 SO(here 等)周围看到了一些对 & 的解释(以及对 | 的大量解释),但没有一个解释在以下场景中使用 &

else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move)  {...}

取自MSDN

谁能解释一下,具体到这个用法?

谢谢。

【问题讨论】:

  • 它检查DragDropEffects.Move 是否是AllowedEffect 枚举值中的设置标志之一。 This should be useful reading
  • 请注意,这个例子有点老了。有来自 .NET 4 的 e.AllowedEffect.HasFlag(DragDropEffects.Move)。您可能会发现它更容易理解。
  • @JesseGood 大多数情况下是更好的选择。但它有缺点:1)速度较慢 2)如果指定多个标志会发生什么并不明显。 (它检查是否设置了所有标志)

标签: c# .net


【解决方案1】:

e.AllowedEffect 可能是位标志的组合。 & 运算符对每个位执行一个位“和”逻辑运算。因此,如果被测位为 1,则结果为单个标志。 可以用这种方式编写测试,结果完全相同:

else if ((e.AllowedEffect & DragDropEffects.Move) != 0 )  {...}

让我们用一个例子更好地解释一下,标志值是这些:

None = 0,

    Copy = 1,

    Move = 2,

    Link = 4,

所以二进制:

无 = 00000000,

Copy = 00000001,

Move = 00000010,

Link = 00000100,

所以我们考虑在测试中我们有复制和移动组合的情况,即值将是:

00000011

按位和移动我们有:

00000011  -->Copy | Move
00000010  -->Move
======== &
00000010 === Move

【讨论】:

    【解决方案2】:

    假设:

    DragDropEffects.Move 有 1 个值。 e.AllowedEffect 的值为 0。

    它将对 2 进行按位与 (1 & 0 = 0) 因此结果当前将为 0:

    DragDropEffects.Move & e.AllowedEffect 在这种情况下将为 0。

    现在考虑一下:

    DragDropEffects.Move 有 1 个值。 e.AllowedEffect 有 1 个值。

    在这种情况下,按位 AND 将返回 1(因为 1 & 1 = 1 在按位 AND 中)所以现在结果将为 1。

    如果其中一位为 0,则按位与将返回 0,我们正在执行 AND,如果所有位都设置为 1,则将返回 1。

    您在问题中链接的this post 中的第二个答案很好地解释了这一点。

    【讨论】:

      【解决方案3】:

      DragDropEffects.Move 设置了一个位,第二个最低有效位使其与数字 2 相同。

      如果您 & 带有 2 的东西,那么如果设置了该位,您将获得 2,如果未设置该位,您将获得 0

      如果DragDropEffects.Move 的标志设置在x 中,则(x & DragDropEffects.Move) == DragDropEffects.Move 将是true,否则false

      在允许自动转换为布尔值的语言中,通常使用更简洁的x & DragDropEffects.Move。不简洁是 C# 不允许这种自动转换的一个缺点,但它确实会犯很多错误,只是不会发生。

      有些人更喜欢替代(x & DragDropEffects.Move) != 0(相反(x & DragDropEffects.Move) == 0 来测试未设置的标志),它具有0 在这里工作的优势,无论枚举类型或测试什么标志。 (如果 CIL 直接变成 brzero 指令,可能会产生一个很小的优势,但我认为它通常不会)。

      【讨论】:

        【解决方案4】:

        DragDropEffects 不仅仅是枚举,这是一组标志,因此在您的示例中,我们检查 e.AllowedEffect 是否为 DragDropEffects.Move 设置了位。

        【讨论】:

          【解决方案5】:

          希望您了解按位运算符的工作原理。

          如果 e.AllowedEffect 设置为 DragDropEffects.Move,那么它们的 & 将导致 e.AllowedEffectDragDropEffects.Move

          e.AllowedEffect = 1
          DragDropEffects.Move = 1
          e.AllowedEffect & DragDropEffects.Move = 1
          

          从 MSDN 示例中,大致意思是:

          '如果 ActiveEffect 设置/等于 DragDropEffects.Move 然后执行此操作...'

          【讨论】:

            猜你喜欢
            • 2015-06-16
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-23
            • 2015-11-30
            • 2017-05-16
            • 2012-10-06
            • 2011-05-18
            相关资源
            最近更新 更多