- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这可能是一个简单的问题,但我仍然对决定使用按位 OR
的原因感到困惑。假设我有一个包含四个字段的 A
类:
class A
{
private int Field1;
private static int Field2;
public int Field3;
public static int Field4;
}
并使用反射
获取字段:
var fields = typeof (A).GetFields(BindingFlags.Public | BindingFlags.Static);
如果你是 Reflection
的新手,不知道如何使用 BindingFlags
,你脑海中最初的逻辑思维是:
此行将选择所有静态或公共(public)字段,因为使用了按位或。以及你认为的预期结果:
Field2
Field3
Field4
但是当按 F5 时,结果会完全不同,按位 OR
相当于 AND
:
Field4
为什么不使用可能符合逻辑思维的按位与运算符。像这样:
var fields = typeof (A).GetFields(BindingFlags.Public & BindingFlags.Static);
我在 MSDN 中找到了单词:
the bitwise OR operation used to combine the flags might be considered an advanced concept in some circumstances that should not be required for simple tasks.
请谁能用简单的方式解释这里的高级概念以便理解?
最佳答案
请参阅末尾的简短摘要。
长答案:
按位或组合枚举标志的位。
例子:
BindingFlags.Public
的值为 16 或 10000(二进制)BindingFlags.Static
的值为 8 或 1000(二进制)按位或将它们组合如下:
10000
01000
--
11000 --> 24
按位 AND 会像这样组合它们:
10000
01000
--
00000 --> 0
这是标志的一个非常基本的概念:
每个值都是 2 的幂,例如:
2^0
2^1
2^2
2^3
它们的位表示始终是 1
,其余为零:
decimal | binary
1 | 0001
2 | 0010
4 | 0100
8 | 1000
使用按位 AND 组合它们中的任何一个将始终导致 0,因为在同一位置没有 1
。按位与会导致完全的信息丢失。
另一方面,按位或总是会产生明确的结果。例如,当您有(二进制)1010(十进制 10)时,您知道它最初是 8 和 2。没有其他可能创建 10。
正如 Default 所说,您调用的方法稍后可以使用按位 AND 运算符提取此信息:
if(10 & 8 == 8) // value 8 was set
在这种情况下,按位或基本上是一种将值传输到您调用的方法的工具。
此方法对这些值所做的操作与按位或的使用无关。
它可以在内部要求所有传递的标志都匹配,就像 GetFields
的情况一样。但它也可能只需要一个传递的标志来匹配。
对于作为调用者的您,以下内容是等价的:
var requiredFlags = new List<BindingFlags>();
requiredFlags.Add(BindingFlags.Public);
requiredFlags.Add(BindingFlags.Static);
typeof (A).GetFields(requiredFlags);
现在不会编译为 GetFields
不提供这样的重载,但其含义与您的代码的含义相同。
总结(TL;DR):
按位与与 bool 与无关
按位或与 bool 或无关
关于c# - 为什么在标志枚举中使用按位或运算符,其含义为 AND,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12490931/
我是一名优秀的程序员,十分优秀!