2017-07-27 48 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