尝试在C#enum中组合位标志

尝试在C#enum中组合位标志,c#,enums,C#,Enums,我希望能够设置并读回以下配置 TR1 TR2 TR3 TR4 如何执行此操作?您的位代码不正确 假设A=0001 假设B=0010 A是设置的第一位,B是设置的第二位 x&~A不是你想的那样~A并不意味着第一位是关闭的,它意味着1110。因此,x&~A只有在设置了这3位时才是真的,而不仅仅是在第一位关闭时 如果希望A未设置,则为((x&A)==0)。或者,如果您想要更干净的代码,请在枚举上使用[Flags]修饰符,然后获得enum.HasFlag()。您需要考虑如何使用这些标志。标志通常不是排他

我希望能够设置并读回以下配置

TR1
TR2
TR3
TR4


如何执行此操作?

您的位代码不正确

假设A=0001 假设B=0010

A是设置的第一位,B是设置的第二位

x&~A不是你想的那样~A并不意味着第一位是关闭的,它意味着1110。因此,x&~A只有在设置了这3位时才是真的,而不仅仅是在第一位关闭时


如果希望A未设置,则为((x&A)==0)。或者,如果您想要更干净的代码,请在枚举上使用[Flags]修饰符,然后获得enum.HasFlag()。

您需要考虑如何使用这些标志。标志通常不是排他性设置;它们是组合使用的。让我们来看看你的逻辑:

对于
TR1

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 = ~(SB1) & ~(SB2),   // BIT12 - 0   BIT13 - 0
请注意,除了
SB1
SB2
之外,这已打开所有标志。设置一个标志不应影响其他标志

您真正想做的是检查设置了哪些标志。为此,您应该使用helper方法,或者使用
Enum.hasvag
。它不应该被烘焙到
enum
本身中,因为它不可能表示
SB1&!SB2作为一组位,同时也将其视为标志

因此,您应该:

0011111111111
然后您可以将其用作:

[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);
    }
}

我希望能够设置上述四种情况以及
HasFlag
仅检查标志是否设置正确?@liv2hak正确。因此,如果值为
A | B
[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()