如何检查数字是否是二进制和的结果
本文关键字:是否是 二进制 和的 结果 数字 何检查 检查 | 更新日期: 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;
希望我的问题足够清楚,有人能帮上忙。
编辑
枚举值总是由2个供电
我想写一个方法来检查给定的数字是否可以是不同二进制和的pice。例如:
int givenNumber = 1; //1 , 3 ,5 and 7 will be the answer
- 真实生活样本:我的数据库中有承包商,每个承包商都可以是数据库中的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();
}
请注意:
- 这对
None
(0)值无效,因此必须手动检查0(因为(x & 0)
始终为0) - 所有值必须是2的幂
- 您可能需要添加
[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