我在SO(here等)周围看到了&
的一些解释(以及对|
的大量解释),但没有一个解释&
的使用在以下场景中:
else if ((e.AllowedEffect & DragDropEffects.Move) == DragDropEffects.Move) {...}
取自MSDN
任何人都可以解释一下这个用途吗?
感谢。
答案 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(按
如果其中一个位为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
的标记设置在true
而DragDropEffects.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.AllowedEffect
或DragDropEffects.Move
,即
e.AllowedEffect = 1
DragDropEffects.Move = 1
e.AllowedEffect & DragDropEffects.Move = 1
来自MSDN示例的,它意味着:
'如果ActiveEffect设置/等于DragDropEffects.Move则执行此操作...'