//each flag is its own bit (C23: the enum type is unsigned)
enum Permission : unsigned {
READ = 1u << 0, //001
WRITE = 1u << 1, //010
EXECUTE = 1u << 2, //100
};
//combine flags
unsigned flags = READ | WRITE;
//flags is 3 (011)
//set a flag
flags |= EXECUTE;
//flags is 7 (111)
//clear a flag
flags &= ~WRITE;
//flags is 5 (101)
//toggle a flag
flags ^= READ;
//flags is 4 (100)
//check a flag
bool canRead = (flags & READ) != 0;
//canRead is false
bool canExecute = (flags & EXECUTE) != 0;
//canExecute is true
//a mask cuts a field out of a number
unsigned color = 0x336699;
unsigned blue = color & 0xFF;
//blue is 153 (0x99)
unsigned green = (color >> 8) & 0xFF;
//green is 102 (0x66)
printf("flags is %u\n", flags);
printf("canRead is %s\n", canRead ? "true" : "false");
printf("canExecute is %s\n", canExecute ? "true" : "false");
printf("blue is %u\n", blue);
printf("green is %u\n", green);