C#:在按位枚举中获得最低值的键

时间:2010-02-26 19:59:16

标签: c# enums bitwise-operators

我喜欢这样的

[Flags]
public enum Key
{
  None = 0,
  A = 1,
  B = 2,
  C = 4
}

我有以下

Key k1 = Key.A | Key.B | Key.C;

我想获得k1中具有最低值的键。我怎么能这样做?

示例:

Key k1 = Key.A | Key.B | Key.C; // I want a 
Key k2 = Key.B | Key.C; // I want b
Key k3 = Key.A | Key.C; // I want a

7 个答案:

答案 0 :(得分:12)

你可以使用一点技巧:

Key key = Key.B | Key.C;
Key lowest = (Key)((int)key & -(int)key);

答案 1 :(得分:6)

Keys key = Keys.b | Keys.c;

var lowest = Enum.GetValues(typeof(Keys))
    .Cast<Keys>()
    .OrderBy(x => x)
    .FirstOrDefault(x => key.HasFlag(x));

稍微高效一点的LINQ方法的.NET 4.0版本。

答案 2 :(得分:4)

Keys key = Keys.b | Keys.c;

var lowest = Enum.GetValues(typeof(Keys))
    .OfType<Keys>()
    .Where(x => (x & key) != 0)
    .OrderBy(x => x)
    .DefaultIfEmpty((Keys)0);

Console.WriteLine(lowest);

答案 3 :(得分:0)

如果enum中只有3个值,那么最快和最简单的就是逐个检查它们。但是,对于一般解决方案,您可能希望尝试将k1的值转换为整数,找到除以它的最大幂2并将其转换回Keys枚举值。

答案 4 :(得分:0)

  1. 获取所有值的列表 枚举
  2. 将这些值映射到某种类型 可比数据类型
  3. 比较所有值并保持 跟踪最低的一个
  4. 将最低的一个转换回 枚举类型

答案 5 :(得分:0)

需要是一个迭代实现,您可以在其中测试位。我会做这样的事情。

unsigned int k = (unsigned int) k1;
int pos = -1;
while (k) {
   pos++;
   if (k & 0x1) break;
   k >>= 1;
}
Keys lowestKey = 0;
if (pos >= 0) lowestKey = 0x1 << pos;

答案 6 :(得分:0)

您最初发布的代码没有意义:a + b + c没有以类型名称作为前缀,因此它们不会引用它们似乎要引用的枚举名称。

此外,如果使用按位AND组合标志,结果将包含所有参数中的所有标志 - 在本例中为none。