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

本文关键字:是否是 二进制 和的 结果 数字 何检查 检查 | 更新日期: 2023-09-27 17:58:15

我有这样的情况:

获得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;

希望我的问题足够清楚,有人能帮上忙。

编辑

  1. 枚举值总是由2个供电

  2. 我想写一个方法来检查给定的数字是否可以是不同二进制和的pice。例如:int givenNumber = 1; //1 , 3 ,5 and 7 will be the answer

  3. 真实生活样本:我的数据库中有承包商,每个承包商都可以是数据库中的Producer=1,Supplier=2,Service=4。在这种情况下,我只能存储1个值int,这是最明智的选择。当我将项目加载到我的服务-承包商组合框时,我希望加载每一行,例如值为4或5或7(因为7=1+2+4,5=1+4和4=4)

现在我的问题更清楚了吗?

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

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

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

请注意:

  1. 这对None(0)值无效,因此必须手动检查0(因为(x & 0)始终为0)
  2. 所有值必须是2的幂
  3. 您可能需要添加[Flag]属性,以便其他开发人员现在可以使用枚举进行逐位操作
    enum Flag
    {
        None = 0,
        First = 1,
        Second = 2,
        Third = 4,
        Fourth = 8
    }
    static void Main(string[] args)
    {
        int givenNumber = 3;
        List<Flag> flags = new List<Flag>();
        int number, result;
        do
        {
            int step = 0;
            do
            {
                number = (int)Math.Pow(2d, ++step);
            } while (number < givenNumber);
            result = (int)Math.Pow(2d, step - 1);
            flags.Add((Flag)result);
            givenNumber -= result;
        } while (givenNumber != 0);
        Debugger.Break();
    }
[Flags]
enum MyType{
  None = 0,
  First = 1,
  Second = 2,
  Third = 4,
  //and so on 
}

使用Flags属性意味着一个简单的toString将为您的下拉提供您想要的内容

MyType test = (MyType)6;
Console.WriteLine(test.ToString());

现在将打印:

Second, Third

而不是6