2017-07-27 152 views
0
public enum EFlagsBmp 
{ 
    None = 0, 
    A = (1 << 0), //1 
    B = (1 << 1), //2 
    C = (1 << 2), //4 
    D = (1 << 3), //8 
    E = (1 << 4), //16 
    F = (1 << 5), //32 
    G = (1 << 6), 
    H = (1 << 7), 
    I = (1 << 8), 
    J = (1 << 9), 
    K = (1 << 10), 
    L = (1 << 11), 
    SB1 = (1 << 12), 
    SB2 = (1 << 13), 
    TR1 = ~(SB1) & ~(SB2), // BIT12 - 0 BIT13 - 0 
    TR2 = (SB1) & ~(SB2), // BIT12 - 1 BIT13 - 0 
    TR3 = ~(SB1) & (SB2), // BIT12 - 0 BIT13 - 1 
    TR4 = (SB1) | (SB2),  // BIT12 - 1 BIT13 - 1 
    VSB = (1 << 18), 
} 

在這裏,我試圖bitflags(BIT12BIT13),如下結合結合Bitflags。嘗試在C#枚舉

SB1 = (1 << 12), 
SB2 = (1 << 13), 
TR1 = ~(SB1) & ~(SB2), // BIT12 - 0 BIT13 - 0 
TR2 = (SB1) & ~(SB2), // BIT12 - 1 BIT13 - 0 
TR3 = ~(SB1) & (SB2), // BIT12 - 0 BIT13 - 1 
TR4 = (SB1) | (SB2),  // BIT12 - 1 BIT13 - 1 

我希望能夠設置和回讀下面的配置

TR1 TR2 TR3 TR4

我該怎麼辦呢?

回答

1

您的按位代碼不正確。

設A = 0001 假設B = 0010

A的第一位置位,B爲第2位被設置

X &〜一個並不意味着你在想什麼。 〜A並不意味着第一位關閉,這意味着1110.所以x &〜A只有當這3位被設置時纔是真實的,而不僅僅是第一位是關閉的。

如果你想要A沒有設置,那就是((x & A)== 0)。或者如果你想要更乾淨的代碼,使用enum上的[Flags]修飾符,然後得到Enum.HasFlag()。

0

你需要想想你試圖與標誌。標誌通常不是專有設置;他們結合使用。因此,讓我們來看看你的邏輯:

對於TR1

TR1 = ~(SB1) & ~(SB2), // BIT12 - 0 BIT13 - 0 

其結果是:

0011111111111 

注意,這已經變成每個標誌除了SB1SB2。設置一個標誌應該而不是影響他人。

你真的想做的是檢查哪些標誌已被設置。爲此,您應該有輔助方法,或使用Enum.HasFlag。它應該而不是本身被烘焙到enum中,因爲它不可能將SB1 & !SB2表示爲一組位,同時也將它們視爲標誌。

因此,你應該有:

[Flags] 
public enum EFlagsBmp 
{ 
    ... 
} 

public static class EFlagsBmpHelper 
{ 
    public static bool TR1(this EFlagsBmp flags) 
    { 
     return !flags.HasFlag(EFlagsBmp.SB1) && !flags.HasFlag(EFlagsBmp.SB2); 
    } 
    public static bool TR2(this EFlagsBmp flags) 
    { 
     return flags.HasFlag(EFlagsBmp.SB1) && !flags.HasFlag(EFlagsBmp.SB2); 
    } 
    public static bool TR3(this EFlagsBmp flags) 
    { 
     return !flags.HasFlag(EFlagsBmp.SB1) && flags.HasFlag(EFlagsBmp.SB2); 
    } 
    public static bool TR4(this EFlagsBmp flags) 
    { 
     return flags.HasFlag(EFlagsBmp.SB1) && flags.HasFlag(EFlagsBmp.SB2); 
    } 
} 

然後您可以爲使用:

EFlagsBmp.K.TR1() 
+0

我希望能夠設置上述四種情況也是如此。 'HasFlag'只檢查標誌是否設置正確? – liv2hak

+0

@ liv2hak這是正確的。所以'HasFlag(A)'如果值是'A |則返回true B' – Rob