2012-09-19 36 views
12

這可能是一個簡單而簡單的問題,但我仍然有點混淆爲什麼按位OR決定使用。假設我有一個類A四個領域:爲什麼在標誌枚舉中使用按位或運算符的含義AND

class A 
{ 
    private int Field1; 
    private static int Field2; 
    public int Field3; 
    public static int Field4; 
} 

並使用Reflection獲得字段:如果你是新手與Reflection

var fields = typeof (A).GetFields(BindingFlags.Public | BindingFlags.Static); 

,不知道怎樣的方式使用BindingFlags時,在你的腦袋初始邏輯思維應該是:

這條線將選擇所有靜態或公共領域,因爲使用位或。和預期的結果,你認爲:

Field2 
Field3 
Field4 

但按F5時,其結果將是完全不同的,按位OR作品AND

Field4 

爲什麼不使用位AND運算符這可能與後續邏輯思維。像這樣:

var fields = typeof (A).GetFields(BindingFlags.Public & BindingFlags.Static); 

我發現單詞MSDN

用來標誌結合位或操作可能會被認爲是不應該被要求簡單的任務,某些情況下的先進理念。

請任何人都可以在這裏以簡單的方式解釋高級概念瞭解嗎?

+1

當您考慮包容性和排他性OR之間的區別時,「OR」似乎是正確的概念。在這種情況下,「OR」是包容性的,就像說「從商店裏拿一些包含雞蛋或火腿的物品」一樣。這與說「含有雞蛋和火腿」不同。您讀取的[MSDN](http://msdn.microsoft.com/zh-cn/library/6ztex2dc.aspx)中的 –

+0

:您必須指定BindingFlags.Instance **或** BindingFlags.Static才能獲得返回。所以可能是你不能同時列出實例**和**靜態...... ?? – tschmit007

+0

@ tschmit007:這與問題有什麼關係? –

回答

25

見一個簡短的總結結束。

龍答:

按位或結合枚舉標誌位。

實施例:

  • BindingFlags.Public具有16個或10000(二進制)
  • BindingFlags.Static具有8個或1000(二進制)

按位的值,或者組合這些像以下的值:

10000 
01000 
-- 
11000 --> 24 

按位AND將組合它們lik E本:

10000 
01000 
-- 
00000 --> 0 

這是標誌一個非常基本的概念:
各值是2的冪,例如:

  • 1 = 2^0
  • 2 = 2^1
  • 4 = 2^2
  • 8 = 2^3

他們的比特表示始終是一個1,其餘零:

decimal | binary 
1  | 0001 
2  | 0010 
4  | 0100 
8  | 1000 

將它們中的任何一個使用按位AND總是會導致0,因爲在同一位置沒有1。按位AND會導致完全的信息丟失。

另一方面,按位OR總是會導致明確的結果。例如,當你有(二進制)1010(十進制10)時,你知道它最初是8和2.沒有其他的可能性10被創建。
作爲默認說,你調用的方法可以在以後提取使用位AND運算符這樣的信息:

if(10 & 8 == 8) // value 8 was set 

按位或在這種情況下,基本上是將值傳輸到您呼叫的方法的車輛。
這些方法對這些值所做的操作與按位OR的用法無關。
它可以內部要求所​​有通過的標誌匹配,如GetFields的情況。但它也可能只需要一個傳遞的標誌匹配。

對於您作爲主叫,下面是等價的:

var requiredFlags = new List<BindingFlags>(); 
requiredFlags.Add(BindingFlags.Public); 
requiredFlags.Add(BindingFlags.Static); 
typeof (A).GetFields(requiredFlags); 

現在,這並不編譯爲GetFields沒有提供這樣的過載,但意思是一樣的你碼。

總結的東西了(TL; DR):

位與已無關,與布爾AND
位或無關布爾OR

+1

**後面的**將與'&'運算符一起用作if if(userArgument&BindingFlags.Public){/ * add to return value * /}' – Default

2

正在使用的標誌枚舉來表示一組布爾條件。

在您的示例中,必須滿足每個布爾條件才能返回相應的字段。

標誌枚舉是符合通常的二進制規則的整數值,因此要設置幾個位,您必須將表示這些位的值或在一起。

一旦你這樣做了,你有一個標誌枚舉與適當的位設置。

您遇到的問題是因爲您正在混淆兩個不同的概念:您爲標誌枚舉構造布爾條件集的方式是一個概念。標誌枚舉的使用方式(或其代表)是一個不同的概念。

前者使用OR來構造一組布爾條件。後者說每個位代表一個必須滿足的布爾條件。

1

GetFields()的實現者選擇解釋各種ORed標誌的組合,表示所選標準的AND組合。

這是有道理的,因爲如果您不需要額外的過濾器,您總是可以放棄標準。