Ich habe eine Enum-Deklaration mit Bit-Flags und ich kann nicht genau herausfinden, wie man das benutzt.Wie man Enums mit Bit-Flags verwendet
enum
{
kWhite = 0,
kBlue = 1 << 0,
kRed = 1 << 1,
kYellow = 1 << 2,
kBrown = 1 << 3,
};
typedef char ColorType;
Ich nehme in einem colorType
mehreren Farben speichern ich zusammen die Bits OR
sollte?
ColorType pinkColor = kWhite | kRed;
Aber angenommen, würde ich möchte überprüfen, ob pinkColor
kRed
enthält, wie würde ich das tun?
Wer kümmert sich um ein Beispiel mit dem mitgelieferten ColorType
Beispiel?
Hinweis: Diese bedeutet, dass, wenn 'pinkColor'' kRed' ist, '(pinkColor & kRed)' zu 'kRed', * nicht * 1 oder' YES' ausgewertet wird! Dies kann ein Fehler sein, wenn Sie einem kleinen Typ wie "BOOL" zuweisen: Wenn der Wert 1 << (Anzahl der Bits in einem "BOOL") oder größer ist, liegt er außerhalb des Bereichs. Eine übliche Lösung ist es, das Ergebnis mit dem getesteten Bit zu vergleichen: 'BOOL isPink = ((pinkColor & kRed) == kRed);' Eine Alternative ist, das Ergebnis in C99s 'Bool'-Typ zu konvertieren:' isPink = (bool) (pinkColor & kRed); 'Und ein (n zugegebenermaßen ungewöhnlicher) Weg, der nicht davon ausgeht, dass 1 im Bereich liegt, würde'?: ':' isPink = (pinkColor & kRed) verwenden? JA: NEIN; ' –
@PeterHosey Relevante weitere Lektüre für alle, die an Ihrem Kommentar interessiert sind: http://www.bignerdranch.com/blog/bools-sharp-corners/. By the way, wenn jemand verwirrt ist (wie ich war) darüber, warum auf der Erde Casting zu einem C99 'bool' anstelle von' BOOL' behebt das Problem, ist die Antwort, dass Casts zu 'Bool' sind Magie, wie in http diskutiert: //stackoverflow.com/questions/16934876/magic-of-casting-value-to-bool. Die Kurzversion ist: 'bool' ist ein Alias von' _Bool' und der C99-Standard sagt * "Wenn ein skalarer Wert in _Bool konvertiert wird, ist das Ergebnis 0, wenn der Wert gleich mit 0 vergleicht; andernfalls ist das Ergebnis 1 . "* –