2017-10-13 89 views
1

我有以下枚舉:標誌數是兩個變量枚舉

[Flags] 
public enum Letter 
{ 
    NONE = 0, 
    A = 1, 
    B = 2, 
    C = 4, 
    A_B = A | B, 
    A_C = A | C, 
    B_C = B | C, 
    ALL = A | B | C 
} 

和我有下面這段代碼:

Letter first = Letter.A_B; 
Letter second = Letter.B_C; 

如何獲得標誌的數量是在first變量,而且在second變量?

我想有結果:

Letter first = Letter.A_B; 
Letter second = Letter.B_C; 
int numberOfSameFlags = ...; // should return 1 in this example 

Letter first = Letter.A_B; 
Letter second = Letter.ALL; 
int numberOfSameFlags = ...; // should return 2 in this example 

我試着位操作,但我不認爲我能得到這個值。

+0

如果你想使用*僅*位運算,你可以做到這一點[這](https://stackoverflow.com/questions/3815165/how實現位數僅使用位運算符)的方式。 –

回答

3

您可以將這些標誌與AND相加,然後計算設置位的數量(這稱爲"Hamming Weight"的整數)。你可以指望設置位

的一種方式(有很多,這是一個我一把抓過網):

public static int HammingWeight(int i) 
{ 
    i = i - ((i >> 1) & 0x55555555); 
    i = (i & 0x33333333) + ((i >> 2) & 0x33333333); 
    return (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24; 
} 

因此,對於你的問題:

Letter first = Letter.A_B; 
Letter second = Letter.B_C; 
Console.WriteLine(HammingWeight((int)first & (int)second)); 

和:

Letter first = Letter.A_B; 
Letter second = Letter.ALL; 
Console.WriteLine(HammingWeight((int)first & (int)second)); 

如果您想知道特定的實現如何工作,請參閱see here

2

另一種可能的答案是通過BitArray類

int f = Convert.ToInt32(first); 
int s = Convert.ToInt32(second); 
BitArray bit = new BitArray(System.BitConverter.GetBytes(f & s)); 
Console.WriteLine(bit.Cast<bool>().Count(x => x));