C#:って最も低い価値のキーをビット単位の列挙型
-
23-09-2019 - |
質問
していまenumのようなこ
[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
解決
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っぽいバージョン
他のヒント
あなたは少しトリックを使用することができます
Key key = Key.B | Key.C;
Key lowest = (Key)((int)key & -(int)key);
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つの値を持っている場合は、
は、おそらく最も速く、最も容易には、それらを一つ一つチェックすることです。一般的な解決のために、しかし、あなたは、整数にk1
の値を変換し、それを分割2の最大の力を見つけて、バックキーの列挙型の値に変換しようとする場合があります。
- 一覧を取得しのすべての値の enum
- 地図価値に何らかの 類似データタイプ
- すべてのスマートフォーンの普及が進 トラックの一
- の変換に最低一つの enumタイプ
あなたはビットをテストし、反復実装する必要があります。私はこのような何かを考えています。
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;
あなたはもともと意味をなさない投稿コード:。+ B + C彼らはを指すことを意図しているように見える列挙名を参照しないように、タイプ名が付けされていません。
あなたはビット単位を使用するとフラグを組み合わせることがあれば、また、結果はのすべてのの偶然にして上のすべてのフラグが含まれています - 。この場合は、いずれも
所属していません StackOverflow