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;
希望我的问题足够清楚,有人能帮上忙
编辑
int givenNumber=1//1、3、5和7将是答案
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)[Flag]
属性,以便其他开发人员现在可以使用enum进行按位操作None
(0)值,因此您必须手动检查0(因为(x&0)
始终为0)[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的要点——今天我(重新)学到了一些东西!