尝试在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()