2016-11-03 2 views
0

Bitwise Enumの順序を識別する賢明な方法はありますか?Bitwise Enumのソート順

は、例えば、この列挙型を取る:

[System.FlagsAttribute()] 
internal enum AnswersSort : int 
{ 
    None = 0, 
    Bounty = 1, 
    MarkedAnswer = 2, 
    MostVotes = 4 
} 

私はさまざまな方法でこれらを組み合わせた場合:

var result = AnswersSort.MarkedAnswer | AnswersSort.MostVotes | AnswersSort.Bounty; 
result = AnswersSort.MostVotes | AnswersSort.Bounty | AnswersSort.MarkedAnswer; 

両方の結果が7であり、順序が失われました。配列やリストを使用せずにこれを行う方法はありますか?理想的には、私は列挙型を使って解決策を探していますが、どうやって可能かどうかわかりません。

+1

あなたが注文したい場合アイテムの場合は、配列やその他のリスト構造が必要です。これは、あなたがなぜこのようなことをしたいのだろうと思っているという不思議な要求です。 –

+0

私の頭はアレイやリストを使用していると言っていますが、私の直感はNAND、XORなどの束であり、これは例えば231,312などです。それは、私は値の連結を行うだろうBitwiseの組み合わせを探していないよ!明らかにこれは、10個未満の項目を持つ列挙型(配列やリストの場合はもちろん)を対象としています。ありがとうジム私はあなたが私の質問に答えたと思います。 –

答えて

1

値が10の場合は、1項目につき4ビットが必要です。 の場合、は1つの40ビット値として組み合わせを扱い、1桁あたり4ビットでエンコードします。だから、あなたの二つの例与えられた:

var result = AnswersSort.MarkedAnswer | AnswersSort.MostVotes | AnswersSort.Bounty; 
result = AnswersSort.MostVotes | AnswersSort.Bounty | AnswersSort.MarkedAnswer; 

最初は、あなたが64ビットの整数でそれを構築することができ

0010 0100 0001 
---- ---- ---- 
    | | - Bounty 
    | - MostVotes 
    - MarkedAnswer 

としてエンコードされます:

long first = BuildValue(AnswersSort.MarkedAnswer, AnswersSort.MostVotes, AnswersSort.Bounty); 

long BuildValue(params AnswersSort[] values) 
{ 
    long result = 0; 
    foreach (var val in values) 
    { 
     result = result << 4; 
     result |= (int)val; 
    } 
    return result; 
} 
+0

これはかなり素晴らしい答えジムです。それは少しシフトしているし、すべて、私は今投票する(午前1時30分)とrepro明日 - ありがとう –