2017-05-29 16 views
-2

フラグを含む次の列挙型があるとします。列挙型フラグのビット演算

[Flags] 
public enum MyFlag 
{ 
    None = 0, 
    Foo = 1 << 0, 
    Bar = 1 << 1, 
    Baz = 1 << 2, 
    Quuz = 1 << 3 
} 

そして、あなたは新しいものと古いインスタンス化:

var newF = MyFlag.Foo | MyFlaq.Quuz; // 1001 
var oldF = MyFlag.Foo | MyFlag.Baz; // 0101 

私の最初の質問:どのようにXORフラグを取得し、新旧の上にビット演算を実行するためには?

var xor = ????? // -> should be 1100 

追加の質問:そのXORフラグを使用して追加フラグと削除フラグを計算する方法は?

MyFlag added = ????? // Do something with new and xor -> should result in : 1000 
MyFlag removed = ????? // Do same thing with old and xor -> should result in: 0100 

これを紙面に手動で行うのは簡単です。

Bitwise operation on paper.

この権利のために利用できるビット演算のいくつかの種類があるはず?私に答えを示してください、私はそれを私のスキルセットに加えます! :-)

の答えは以下のとおりです。

var xor = newF^oldF; 
var added = newF & xor; 
var removed = oldF & xor; 
+0

なぜYはありません私はちょうど "C#ビットワイズ演算子"のためのGoogle? –

+1

'^':例: 'var xor = @new^old;' 'new'はC#のキーワードであるので、名前を使うときは' @ new'としてください。 –

+0

SOはこの種の質問をする形式ではありません。 [documentation](https://msdn.microsoft.com/en-us/library/17zwb64t.aspx)を参照してください。 – dlatikay

答えて

1

^をお試しください。 、newは、C#でキーワードであることがわかり、それはそれが名前として使われているとき@newとして配置する必要があります理由ですしてください。

// 1100 
    Console.Write(Convert.ToString((int)xor, 2)); 

最後に

var @new = MyFlag.Foo | MyFlag.Quuz; // 1001 
    var old = MyFlag.Foo | MyFlag.Baz; // 0101 

    var xor = @new^old; // <- xor 

テスト、あなたが探しているようですビット単位の&ためaddedremoved値を取得します

MyFlag added = xor & @new; // 1000 
    MyFlag removed = xor & old; // 0100 
+0

'var added = newF & xor;'の部分を追加してください。私はあなたの答えを受け入れます。 –