Challenges/Memory & Types/Enum as Bit Flags

Enum as Bit Flags

๐ŸŸก Standard

Enum as Bit Flags

Define an enum for device status flags and implement two functions:

- `set_flag(status, flag)` โ€” sets a flag, returns new status

- `has_flag(status, flag)` โ€” returns 1 if flag is set, 0 otherwise

typedef enum {

FLAG_NONE = 0,

FLAG_READY = (1 << 0),

FLAG_BUSY = (1 << 1),

FLAG_ERROR = (1 << 2),

FLAG_OVERFLOW = (1 << 3),

} DeviceFlags;

Why it matters: Hardware registers are made of bit flags. You'll use this every single day writing embedded firmware.

example
typedef enum {
    FLAG_NONE     = 0,
    FLAG_READY    = (1 << 0),
    FLAG_BUSY     = (1 << 1),
    FLAG_ERROR    = (1 << 2),
    FLAG_OVERFLOW = (1 << 3),
} DeviceFlags;

Test Cases

1.
set FLAG_READY on empty status
set_flag(0, FLAG_READY) == 1
2.
set multiple flags
set_flag(FLAG_READY, FLAG_ERROR) == (FLAG_READY | FLAG_ERROR)
3.
has_flag detects a set flag
has_flag(FLAG_READY | FLAG_ERROR, FLAG_ERROR) == 1
4.
has_flag returns 0 for unset flag
has_flag(FLAG_READY, FLAG_BUSY) == 0
solution.c