查找按位运算结果的最有效方法
Most efficient way of looking up the results of a Bitwise operation
我有一些用另一种语言编写的代码,它使用枚举和枚举中的值列表,然后使用按位从枚举中获取值列表的整数。
HELLO = 1
WORLD = 2
AND = 4
SO = 8
ON = 16
因此,如果我的列表中有 HELLO 和 SO,我会得到
的值
1 | 1000 = 1001
1001bin to dec = 9
我正在尝试找出获取此整数并返回包含的枚举列表的最有效方法。
在 C# 中使用 Enum.HasFlag(v)
。如果枚举的值设置为 v
,它将 return。
假设您想直接使用枚举,所有枚举的基本类型都是整数。有了这些知识,您就可以利用整数的 "unbounded" 性质并发挥枚举的优点。
enum Greetings {
HELLO = 1,
WORLD = 2,
AND = 4,
SO = 8,
ON = 16
}
所以如果你从被调用者那里得到一个整数(做互操作?),你可以这样做:
Greetings greet = (Greetings)theIntegerResult;
之后,您可以执行按位运算以查看设置了哪些字段。
bool isHelloSet = (greet & Greetings.HELLO) == Greetings.HELLO;
bool isWorldSet = (greet & Greetings.WORLD) == Greetings.WORLD;
bool isAndSet = (greet & Greetings.AND) == Greetings.AND;
bool isSoSet = (greet & Greetings.SO) == Greetings.SO;
bool isOnSet = (greet & Greetings.ON) == Greetings.ON;
我有一些用另一种语言编写的代码,它使用枚举和枚举中的值列表,然后使用按位从枚举中获取值列表的整数。
HELLO = 1
WORLD = 2
AND = 4
SO = 8
ON = 16
因此,如果我的列表中有 HELLO 和 SO,我会得到
的值1 | 1000 = 1001
1001bin to dec = 9
我正在尝试找出获取此整数并返回包含的枚举列表的最有效方法。
在 C# 中使用 Enum.HasFlag(v)
。如果枚举的值设置为 v
,它将 return。
假设您想直接使用枚举,所有枚举的基本类型都是整数。有了这些知识,您就可以利用整数的 "unbounded" 性质并发挥枚举的优点。
enum Greetings {
HELLO = 1,
WORLD = 2,
AND = 4,
SO = 8,
ON = 16
}
所以如果你从被调用者那里得到一个整数(做互操作?),你可以这样做:
Greetings greet = (Greetings)theIntegerResult;
之后,您可以执行按位运算以查看设置了哪些字段。
bool isHelloSet = (greet & Greetings.HELLO) == Greetings.HELLO;
bool isWorldSet = (greet & Greetings.WORLD) == Greetings.WORLD;
bool isAndSet = (greet & Greetings.AND) == Greetings.AND;
bool isSoSet = (greet & Greetings.SO) == Greetings.SO;
bool isOnSet = (greet & Greetings.ON) == Greetings.ON;