在这种情况下使用按位AND(&)

时间:2015-06-03 09:42:46

标签: c# .net

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

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

取自MSDN

任何人都可以解释一下这个用途吗?

感谢。

5 个答案:

答案 0 :(得分:1)

假设:

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

它将执行2的按位AND (1& 0 = 0),因此结果当前为0:

在这种情况下,

DragDropEffects.Move & e.AllowedEffect将为0。

现在考虑一下:

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

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

如果其中一个位为0,则按位AND将返回0,如果所有位都设置为1,则返回1.

您在问题中链接的this post中的第二个答案解释得很清楚。

答案 1 :(得分: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,

因此我们考虑在测试中我们有Copy和Move的组合的情况,即值将是:

00000011

按位和移动我们有:

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

答案 2 :(得分:1)

DragDropEffects.Move有一个位设置,第二个最不重要,它与数字2相同。

如果您使用& 2,那么如果设置了该位,您将获得2,如果未设置该位,您将获得0

如果(x & DragDropEffects.Move) == DragDropEffects.Move的标记设置在trueDragDropEffects.Move设置为x,则false将为x & DragDropEffects.Move

在允许自动转换为布尔值的语言中,通常使用更简洁的(x & DragDropEffects.Move) != 0。缺乏简洁是C#不允许这样的自动转换的缺点,但它确实会犯很多错误。

有些人更喜欢替代(x & DragDropEffects.Move) == 0(反之为0来测试未设置的标志),无论枚举类型是什么或者什么,brzero都可以在这里工作旗帜经过测试。 (并且如果将CIL直接转换为apply plugin: 'com.android.application' android { compileSdkVersion 22 buildToolsVersion '22.0.1' defaultConfig { applicationId "com.example.android.helloworld" minSdkVersion 15 targetSdkVersion 22 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies {} 指令,可能会产生一个小的优势,导致CIL非常小,但我认为它通常不会。)

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

如果e.AllowedEffect设置为DragDropEffects.Move,那么他们的&将产生e.AllowedEffectDragDropEffects.Move,即

e.AllowedEffect = 1
DragDropEffects.Move = 1
e.AllowedEffect & DragDropEffects.Move = 1
来自MSDN示例的

,它意味着:

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