按位组合作为整数枚举
bitwise combination as integer to enum
目前我正在尝试解析一个整数,该整数是来自第三方 API 的枚举的按位组合。例如:我收到一个 integer
值 1035
这个值包含三个枚举值;
enum Status
1= "Status 1"
2= "Status 2"
4= "Status 3"
8= "Status 4"
........
1024= "Status 8"
end enum
所以我需要一个将值 1035
转换为 Status 1 + Status 2 + Status 4 + Status 8
的函数
尝试将其转换为 Bit,然后使用位移位,但这并没有给我正确的结果...希望有人可以在 C# 或 vb.net 示例中帮助我。
您可以使用 [Flags]
属性执行此操作:
[Flags]
enum bla {
foo = 1,
bar = 2,
baz = 4
}
public void Foo() {
bla flag = (bla)3; // Flags foo and bar
int andBackToInt = (int)flag; // 3
}
位运算符可以用来解决这个问题。 (1<< i) 给出 2 的 "i" 次方。然后,当且仅当 "value".
中存在相应的 2 次幂时,"value" 的按位与 (&) 给出非零数
public static void GetFlags(int value)
{
for (int i = 0; i < 20; i++)
{
if (((1 << i) & value) > 0)
Console.WriteLine($"Status {i + 1} is present");
}
}
如果将 [Flags]
属性应用于枚举,它将使枚举的 ToString()
return 成为一个字符串,指示设置了哪些位 - 但我不认为对你很有用,除了它在记录枚举是一个标志枚举方面的作用。
但是,无论 [Flags]
属性是否存在,Enum.HasFlag()
都会告诉您是否设置了标志。
这个示例控制台应用程序应该清楚:
using System;
namespace Demo
{
[Flags]
enum Status
{
None = 0,
Status1 = 1,
Status2 = 2,
Status3 = 4,
Status4 = 8,
Status5 = 16,
Status6 = 32,
Status7 = 64,
Status8 = 128,
Status9 = 256,
Status10 = 512,
Status11 = 1024
}
class Program
{
static void Main()
{
Status s = (Status)1035;
Console.WriteLine(s); // "Status1, Status2, Status4, Status11"
if (s.HasFlag(Status.Status4)) // "Status 4 is set"
Console.WriteLine("Status4 is set");
else
Console.WriteLine("Status4 is not set");
if (s.HasFlag(Status.Status3)) // "Status 3 is not set"
Console.WriteLine("Status3 is set");
else
Console.WriteLine("Status3 is not set");
}
}
}
注意:您的枚举似乎缺少一些值! 1024 值应该是 Status11,而不是 Status8。
另请注意,为了完整性,我添加了一个 "None" 值。
感谢大家的快速回复,非常感谢! :-)
这个属性对我来说是新的。第三方枚举没有标志属性,这就是枚举的 Ctype 没有 return 所有值的原因。所以我最终复制了所有枚举值(通过对象浏览器很容易)并创建了一个带有标志属性集的本地枚举。现在它像我希望的那样转换了!
谢谢大家!
目前我正在尝试解析一个整数,该整数是来自第三方 API 的枚举的按位组合。例如:我收到一个 integer
值 1035
这个值包含三个枚举值;
enum Status
1= "Status 1"
2= "Status 2"
4= "Status 3"
8= "Status 4"
........
1024= "Status 8"
end enum
所以我需要一个将值 1035
转换为 Status 1 + Status 2 + Status 4 + Status 8
尝试将其转换为 Bit,然后使用位移位,但这并没有给我正确的结果...希望有人可以在 C# 或 vb.net 示例中帮助我。
您可以使用 [Flags]
属性执行此操作:
[Flags]
enum bla {
foo = 1,
bar = 2,
baz = 4
}
public void Foo() {
bla flag = (bla)3; // Flags foo and bar
int andBackToInt = (int)flag; // 3
}
位运算符可以用来解决这个问题。 (1<< i) 给出 2 的 "i" 次方。然后,当且仅当 "value".
中存在相应的 2 次幂时,"value" 的按位与 (&) 给出非零数public static void GetFlags(int value)
{
for (int i = 0; i < 20; i++)
{
if (((1 << i) & value) > 0)
Console.WriteLine($"Status {i + 1} is present");
}
}
如果将 [Flags]
属性应用于枚举,它将使枚举的 ToString()
return 成为一个字符串,指示设置了哪些位 - 但我不认为对你很有用,除了它在记录枚举是一个标志枚举方面的作用。
但是,无论 [Flags]
属性是否存在,Enum.HasFlag()
都会告诉您是否设置了标志。
这个示例控制台应用程序应该清楚:
using System;
namespace Demo
{
[Flags]
enum Status
{
None = 0,
Status1 = 1,
Status2 = 2,
Status3 = 4,
Status4 = 8,
Status5 = 16,
Status6 = 32,
Status7 = 64,
Status8 = 128,
Status9 = 256,
Status10 = 512,
Status11 = 1024
}
class Program
{
static void Main()
{
Status s = (Status)1035;
Console.WriteLine(s); // "Status1, Status2, Status4, Status11"
if (s.HasFlag(Status.Status4)) // "Status 4 is set"
Console.WriteLine("Status4 is set");
else
Console.WriteLine("Status4 is not set");
if (s.HasFlag(Status.Status3)) // "Status 3 is not set"
Console.WriteLine("Status3 is set");
else
Console.WriteLine("Status3 is not set");
}
}
}
注意:您的枚举似乎缺少一些值! 1024 值应该是 Status11,而不是 Status8。
另请注意,为了完整性,我添加了一个 "None" 值。
感谢大家的快速回复,非常感谢! :-)
这个属性对我来说是新的。第三方枚举没有标志属性,这就是枚举的 Ctype 没有 return 所有值的原因。所以我最终复制了所有枚举值(通过对象浏览器很容易)并创建了一个带有标志属性集的本地枚举。现在它像我希望的那样转换了!
谢谢大家!