C# 如何检查数字是否是二进制和的结果?

C# 如何检查数字是否是二进制和的结果?,c#,enums,C#,Enums,我有这样的情况: static IEnumerable<MyEnum> GetFlags(this MyEnum e) { var flags = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>(); foreach (var flag in flags) if ((flag & e) > 0) yield return flag; } int givenNumber = 3; var

我有这样的情况:

static IEnumerable<MyEnum> GetFlags(this MyEnum e)
{
    var flags = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>();
    foreach (var flag in flags)
        if ((flag & e) > 0) yield return flag;
}
int givenNumber = 3;
var results = ((MyEnum)givenNumber).GetFlags();
获取
enum

enum MyType{
    None = 0,
    First = 1,
    Second = 2,
    Third = 4,
    //and so on 
}
现在我不想检查给定的数字是否是二进制和的结果

int givenNumber = 3;
int result = 
//how to get that it's sum of 2 enums in this particular case would be (int)Type.First & (int)Type.Second == 3;
希望我的问题足够清楚,有人能帮上忙

编辑

  • 枚举值始终由2供电

  • 我想写一个方法来检查给定的数字可以是一个不同的二进制和示例:
    int givenNumber=1//1、3、5和7将是答案

  • 真实生活样本: 我的数据库中有承包商,每个承包商在数据库中可以是生产者=1,供应商=2,服务=4,我只能存储1个值int,在这种情况下,这是最明智的选择。当我将项目加载到服务承包商的组合框中时,我希望加载每一行,例如值为4、5或7(因为7=1+2+4、5=1+4和4=4)
  • 现在我的问题更清楚了吗

    private enum YourType
    {
        None = 0,
        First = 1,
        Second = 2,
        Third = 4,
    }
    
    private static void Main(string[] args)
    {
        int givenNumber = 3;
        YourType castedNumber = (YourType)givenNumber;
    
        if ((castedNumber & YourType.First) == YourType.First)
        {
            Console.WriteLine("First");
        }
    
        if ((castedNumber & YourType.Second) == YourType.Second)
        {
            Console.WriteLine("Second");
        }
    
        if ((castedNumber & YourType.Third) == YourType.Third)
        {
            Console.WriteLine("Third");
        }
    
        Console.Read();
    }
    
    请注意:

  • 这不适用于
    None
    (0)值,因此您必须手动检查0(因为
    (x&0)
    始终为0)
  • 所有值必须是2的幂
  • 您可能需要添加
    [Flag]
    属性,以便其他开发人员现在可以使用enum进行按位操作
  • 请注意:

  • 这不适用于
    None
    (0)值,因此您必须手动检查0(因为
    (x&0)
    始终为0)
  • 所有值必须是2的幂
  • 您可能需要添加
    [Flag]
    属性,以便其他开发人员现在可以使用enum进行按位操作

  • 您可以获得如下所示的单个枚举:

    static IEnumerable<MyEnum> GetFlags(this MyEnum e)
    {
        var flags = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>();
        foreach (var flag in flags)
            if ((flag & e) > 0) yield return flag;
    }
    
    int givenNumber = 3;
    var results = ((MyEnum)givenNumber).GetFlags();
    

    您可以获得如下所示的单个枚举:

    static IEnumerable<MyEnum> GetFlags(this MyEnum e)
    {
        var flags = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>();
        foreach (var flag in flags)
            if ((flag & e) > 0) yield return flag;
    }
    
    int givenNumber = 3;
    var results = ((MyEnum)givenNumber).GetFlags();
    
    enum标志
    {
    无=0,
    第一个=1,
    秒=2,
    第三个=4,
    第四=8
    }
    静态void Main(字符串[]参数)
    {
    int givenNumber=3;
    列表标志=新列表();
    整数,结果;
    做
    {
    int步长=0;
    做
    {
    number=(int)Math.Pow(2d,+步长);
    }while(数字<给定数字);
    结果=(int)Math.Pow(2d,步骤-1);
    标志。添加((标志)结果);
    givenNumber-=结果;
    }while(给定编号!=0);
    Debugger.Break();
    }
    
    枚举标志
    {
    无=0,
    第一个=1,
    秒=2,
    第三个=4,
    第四=8
    }
    静态void Main(字符串[]参数)
    {
    int givenNumber=3;
    列表标志=新列表();
    整数,结果;
    做
    {
    int步长=0;
    做
    {
    number=(int)Math.Pow(2d,+步长);
    }while(数字<给定数字);
    结果=(int)Math.Pow(2d,步骤-1);
    标志。添加((标志)结果);
    givenNumber-=结果;
    }while(给定编号!=0);
    Debugger.Break();
    }
    
    使用Flags属性意味着一个简单的toString将为您的下拉列表提供所需内容

    i、 e

    现在将打印:

    Second, Third
    
    而不是6

    使用Flags属性意味着一个简单的toString将为您的下拉列表提供所需内容

    i、 e

    现在将打印:

    Second, Third
    

    你的
    枚举数是否总是2的幂?看看这个答案,你的意思是求和还是按位和?不,你的问题不是clear@harry180-您能否更新您的示例,使其成为一个真实的示例,而不是a)没有实际编译的示例,B)清楚您想要的是求和还是按位and?因为按位AND不会得到您想要的结果。您的
    枚举是否总是2的幂?看看这个答案,您的意思是求和还是按位AND?不,你的问题不是clear@harry180-您能否更新您的示例,使其成为一个真实的示例,而不是a)没有实际编译的示例,B)清楚您想要的是求和还是按位and?因为一个按位的,不会得到你想要的。整洁!我还打算建议GetValues,但没有抓住foreach的要点——今天我(重新)学到了一些东西!整洁的我还打算建议GetValues,但没有抓住foreach的要点——今天我(重新)学到了一些东西!