2013-02-08 86 views
0

我的情況是這樣的:如何檢查數字是否是二進制和的結果?

enum

enum MyType{ 
    None = 0, 
    First = 1, 
    Second = 2, 
    Third = 4, 
    //and so on 
} 

現在我wan't檢查,如果給定的數字是二進制的,例如

int givenNumber = 3; 
int result = 
//how to get that it's sum of 2 enums in this particular case would be (int)Type.First & (int)Type.Second == 3; 

希望總和的結果我的問題很清楚,有人可以幫助解決這個問題。

編輯

  1. 枚舉值總是搭載2

  2. 我希望編寫應檢查給定數量的一個方法可以是不同的二進制總和示例的一個PICE:int givenNumber = 1; //1 , 3 ,5 and 7 will be the answer

  3. 現實生活中的樣本: 我在我的數據庫中有承包商,每個承包商都可以是生產者= 1,供應商= 2,服務= 4分貝我只能存儲1個val在這種情況下,int將是最明智的選擇。當我裝載物品到我的服務組合框 - 承包人慾加載的每一行具有例如值4或5或7(怎麼一回事,因爲7 = 1 + 2 + 4,5 = 1 + 4和4 = 4)。

現在我的問題更清楚了嗎?

+1

是你的'總是enums' 2的冪? – ogzd 2013-02-08 13:04:10

+1

看一看這個答案,HTTP://計算器。COM /問題/ 8447 /枚舉標記屬性 – 2013-02-08 13:04:29

+0

你的意思總和,或按位和? – Benubird 2013-02-08 13:05:17

回答

5

你可以得到單個枚舉這樣的:

static IEnumerable<MyEnum> GetFlags(this MyEnum e) 
{ 
    var flags = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>(); 
    foreach (var flag in flags) 
     if ((flag & e) > 0) yield return flag; 
} 

那麼你可以使用它像這樣:

int givenNumber = 3; 
var results = ((MyEnum)givenNumber).GetFlags(); 
+2

整潔!我也打算建議GetValues,但錯過了關於foreach的觀點 - 我今天(重新)學到了一些東西! – CHill60 2013-02-08 13:43:21

1
private enum YourType 
{ 
    None = 0, 
    First = 1, 
    Second = 2, 
    Third = 4, 
} 

private static void Main(string[] args) 
{ 
    int givenNumber = 3; 
    YourType castedNumber = (YourType)givenNumber; 

    if ((castedNumber & YourType.First) == YourType.First) 
    { 
     Console.WriteLine("First"); 
    } 

    if ((castedNumber & YourType.Second) == YourType.Second) 
    { 
     Console.WriteLine("Second"); 
    } 

    if ((castedNumber & YourType.Third) == YourType.Third) 
    { 
     Console.WriteLine("Third"); 
    } 

    Console.Read(); 
} 

請注意:

  1. 這不會爲None(0)值,所以你必須手動檢查0(如(x & 0)始終爲0)
  2. 所有值都必須是2
  3. 功率您可能要添加[Flag]屬性,以便其他開發人員現在將枚舉與位運算的作品
0
enum Flag 
    { 
     None = 0, 
     First = 1, 
     Second = 2, 
     Third = 4, 
     Fourth = 8 
    } 

    static void Main(string[] args) 
    { 
     int givenNumber = 3; 
     List<Flag> flags = new List<Flag>(); 

     int number, result; 
     do 
     { 
      int step = 0; 
      do 
      { 
       number = (int)Math.Pow(2d, ++step); 
      } while (number < givenNumber); 
      result = (int)Math.Pow(2d, step - 1); 
      flags.Add((Flag)result); 
      givenNumber -= result; 
     } while (givenNumber != 0); 

     Debugger.Break(); 
    } 
0
[Flags] 
enum MyType{ 
    None = 0, 
    First = 1, 
    Second = 2, 
    Third = 4, 
    //and so on 
} 

使用標誌的屬性是一個簡單的toString會給你你想爲你的下拉什麼

MyType test = (MyType)6; 
Console.WriteLine(test.ToString()); 

現在會打印:的

Second, Third 

,而不是6

相關問題