I have an enum declaration using bit flags and I cant exactly figure out on how to use this.
enum { kWhite = 0, kBlue = 1 << 0, kRed = 1 << 1, kYellow = 1 << 2, kBrown = 1 << 3, }; typedef char ColorType;
I suppose to store multiple colors in one colorType
I should OR
the bits together?
ColorType pinkColor = kWhite | kRed;
But suppose I would want to check if pinkColor
contains kRed
, how would I do this?
Anyone care to give me an example using the provided ColorType
example ?
The idea of Enum Flags is to take an enumeration variable and allow it hold multiple values. It should be used whenever the enum represents a collection of flags, rather than representing a single value. Such enumeration collections are usually manipulated using bitwise operators.
The [Flag] attribute is used when Enum represents a collection of multiple possible values rather than a single value. All the possible combination of values will come. The [Flags] attribute should be used whenever the enumerable represents a collection of possible values, rather than a single value.
Bitmask enums are a way of organizing flags. Like having a collection of booleans without having to keep track of a dozen different variables. They are fast and compact, so generally good for network related data.
Yes, use bitwise OR (|
) to set multiple flags:
ColorType pinkColor = kWhite | kRed;
Then use bitwise AND (&
) to test if a flag is set:
if ( pinkColor & kRed ) { // do something }
The result of &
has any bit set only if the same bit is set in both operands. Since the only bit in kRed
is bit 1, the result will be 0 if the other operand doesn't have this bit set too.
If you need to get whether a particular flag is set as a BOOL
rather than just testing it in an if
condition immediately, compare the result of the bitwise AND to the tested bit:
BOOL hasRed = ((pinkColor & kRed) == kRed);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With