How to use enums with bit flags
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);
Related videos on Youtube
Oysio
Updated on May 01, 2022Comments
-
Oysio about 2 years
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 shouldOR
the bits together?ColorType pinkColor = kWhite | kRed;
But suppose I would want to check if
pinkColor
containskRed
, how would I do this?Anyone care to give me an example using the provided
ColorType
example ? -
Nico almost 14 yearsNote: This means that if
pinkColor
iskRed
,(pinkColor & kRed)
will evaluate tokRed
, not 1 orYES
! This can be a pitfall when assigning to a small type such asBOOL
: If the value is 1 << (number of bits in aBOOL
) or greater, it will be out of range. A common fix is to compare the result to the tested bit:BOOL isPink = ((pinkColor & kRed) == kRed);
An alternative is to cast the result to C99'sbool
type:isPink = (bool)(pinkColor & kRed);
And a(n admittedly uncommon) way that doesn't assume 1 is in range would use?:
:isPink = (pinkColor & kRed) ? YES : NO;
-
Mark Amery about 10 years@PeterHosey Relevant further reading for anyone interested in your comment: bignerdranch.com/blog/bools-sharp-corners. By the way, if anyone is confused (as I was) about why on earth casting to a C99
bool
instead ofBOOL
fixes the problem, the answer is that casts tobool
are magic, as discussed in stackoverflow.com/questions/16934876/…. The short version is:bool
is an alias of_Bool
and the C99 standard says "When any scalar value is converted to _Bool, the result is 0 if the value compares equal to 0; otherwise, the result is 1."