2017-05-29 4 views
-2

Angenommen, Sie haben die folgende Enumeration, die Flags enthält.Bitweise Operationen auf Enum Flag

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

Und Sie instanziiert eine neue und alte:

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

Meine erste Frage: Wie eine bitweise Operation auf neue und alte auszuführen, die XOR-Flag zu bekommen?

Dann eine zusätzliche Frage: Wie verwendet man diese XOR-Flags, um hinzugefügte und entfernte Flags zu berechnen?

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 

Dies manuell auf einem Blatt Papier zu tun ist super einfach.

Bitwise operation on paper.

Es sollte eine gewisse Art von bitweise Operation für dieses Recht zur Verfügung stehen? Bitte zeigen Sie mir die Antwort und ich werde es zu meinem Skillset hinzufügen! :-)

Die Antworten sind:

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

Warum nicht y Oder googeln Sie einfach nach "C# bitwise operators"? –

+1

'^': z.B. 'var xor = @new^old;' Bitte beachten Sie, da 'new' ein Schlüsselwort in C# ist, sollte es als' @ new' gesetzt werden, wenn ein Name verwendet wird. –

+0

SO ist kein Format, um diese Art von Fragen zu stellen. look it up in [Dokumentation] (https://msdn.microsoft.com/en-us/library/17zwb64t.aspx) – dlatikay

Antwort

1

^ Versuchen; Bitte beachten Sie, dass new ein Stichwort in C# ist und deshalb als @new gestellt werden sollte, wenn es als Name verwendet wird:

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

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

-Test

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

Schließlich scheint es, dass Sie suchen, für bitweise &added und removed Werte zu erhalten:

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

Bitte fügen Sie den 'var added = newF & xor;' Teil hinzu und ich werde Ihre Antwort akzeptieren. –