Die Kombination von Enum-Wert mit der Bitmaske
Ich verstehen es ist möglich, verwenden Bitmasken in der enum-Werte, aber ich weiß nicht, wie um es zu schaffen.
Ich habe ein einfaches enum :
enum State
{
minimizing = 0,
maximizing,
minimized,
maximized
};
Einem Zustand ist immer State.minimized
oder State.maximized
, und kann haben zusätzliche Status, die auf Größe ändern. So etwas kann Maximiert und minimiert
InformationsquelleAutor Thomas Joulin | 2011-02-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werde ich davon ausgehen, dass
myState
hat der Typ Ihresenum State
.Die traditionelle Verwendung von
enum
zu erstellen, die Konstante Werte, die eine variable dieses Typs annehmen kann. Sie möchten, setzen Sie die variablemyState
zu einem Kombination der definierten Werte in dieenum
.Den
enum
definiert, 1, 2, 4 und 8 als gültige Werte, aber Sie wollen in der Lage sein, die variable an 4 | 2 = 6. Während C verwendet Ihre Implementierung-definiertint
geben Sie für alleenum
es ist nicht der Fall, in C++.myState = 6
ist nicht gültig in C++. EigentlichmyState = 4
ist nicht gültig in C++, müssen Sie die cast explizit oder verwenden Sie eine der Konstanten-Namen derenum
.Zwar möglich, in C, es ist keine gute Praxis zu setzen
myState
auf einen Wert, der nicht definiert durch seinen Typ (zum Beispiel auf 6).In Ihrem Fall, eine Lösung, die scheint konsequenter wäre:
Diese Weise können Sie schreiben, um die Felder
current
undnext
undependently.Wenn Sie wollen immer noch zu haben, bit-Felder, können Sie die Größe der Elemente der Struktur, die in bits. Es ist ziemlich gefährlich, obwohl die Umsetzung der bit-Felder hängt von Ihrem compiler. Ich bin auch nicht sicher, ob Compiler akzeptieren würde, um einen enum-Typ in einem bit-Feld (sollte ok in C, da
enum
s sindint
).Vorhergehenden angegebenen Lösungen gelten natürlich. Mein Punkt ist, dass, wenn die variable
myState
hat Ihreenum State
als Typ, es sollten nur die Mitglieder derenum
für seine Werte, nicht eine Kombination.Vielleicht
myState
hat eine andere Art, was weiß ich.Wenn
myState
ist nicht derenum State
geben, dann können Sie die definierten Konstanten in Ihremenum
in Kombination.Dies ermöglicht Ihnen, zwei Dinge zu tun, die in einer Zuweisung:
Aber auch Dinge, die Sie wahrscheinlich nicht wollen:
MAXIMIZED | MINIMIZED
ist möglich, und es ist besser für die Lesbarkeit auf zwei enums.Bitte beachten Sie, dass die Beschränkung Aufzählungen bit-fileds sind Undefiniertes Verhalten und das Ergebnis hängt von der compiler. Auch bitte korrigieren Sie mich, Wenn ich falsch Liege.
Sie scheinen richtig zu sein, vielen Dank dafür!!!! stackoverflow.com/a/33590935/108802
InformationsquelleAutor Gauthier
Verwenden Sie ein anderes bit für jeden Wert in der enumeration, wie:
Dann kombinieren Sie mehrere Werte durch bitweise oder-Verknüpfung (
minimizing | maximized
) und testen Sie die Werte mit dem bitweisen und (bool is_minimized = (flags & minimized);
).(1u << 0)
,(1u << 1)
,(1u << 2)
,(1u << 3)
. Es ist mehr klar, welches bit gemeint ist.Warum definieren Sie die Werte in hex-Schreibweise?
minimizing = 1
funktioniert auchtut es, aber wenn Sie fügen Sie eine weitere Zustand ist, und Sie sind mit und ohne Dezimalpunkt, Sie würde haben schreiben 16. Sagen, dass Sie das wollen, legen Sie zwei bits, bit 4 und bit 1. Das Ergebnis ist 18 dezimal, das ist schlechter lesbar als 0x12 (falls dies nicht offensichtlich ist, versuchen Sie, zu identifizieren, welche bits gesetzt sind, in 2398 dezimal. Viel leichter, wenn Sie den Gegenwert 0x95E). Wenn Sie interessiert sind, in der die bits gesetzt sind, hexadezimal ist der Weg zu gehen.
InformationsquelleAutor Victor Nicollet
Ich gerade versucht, diese in VS2012, der Optimierer scheint richtig zu kombinieren bits ohne die Notwendigkeit für Hilfe, wenn Sie mit bitfields.
dann
Legt die beiden bits mit einer Instruktion.
InformationsquelleAutor Rico Mariani
Können Sie diese Wirkung, indem Sie alle Felder in enum-und erhöht in Potenzen von zwei, um die bit-Maske-Effekt. Zum Beispiel, in Ihrem Fall:
So können Sie dann Ihre Kombinationen von
(State.maximized | State.minimizing)
. Dies wird nicht jedoch gelten die Beschränkung, nurState.maximized
oderState.minimized
. Wenn Sie wollen, um zu tun, dass man konvertieren Sie Sie in ein einzelnes bit, aber ich kann mir vorstellen in diesem Beispiel würden Sie wollen, um in der Lage sein einen Fall, wo es weder maximiert noch minimiert.aber dann, wie kann ich es nutzen ? Wie ich haben :
myState = minimized; if (isMaximizing) { myState = maximizing }
ich möchte, um die Maximierung der Staat, ohne dabei die minimierten ZustandDann können Sie
myState |= maximizing;
. Dies setzt das bit, Sie sind interessant, ohne Sie zu berühren die anderen bits. Für den Nullabgleich verwendenmyState &= ~maximizing;
. Seien Sie vorsichtig, wenn dabei VergleichemyState == minimized
wird nicht funktionieren, Sie müssten(myState & minimized) == minimized
(oder!= 0
). Wenn ich du wäre, würde ich prüfen, um eine Struktur mit einem Feld "current state" und eine für "next state".Beachten Sie, dass während der
enum State
definiert einige Konstanten nicht definiert eine Kombination von Ihnen. WennmyState
zu minimieren und zu maximieren, wird der daraus resultierende Wert0x02 | 0x04
, das ist0x06
. Nicht ein Wert definiert, indem Sie Ihre enum.InformationsquelleAutor dlanod