位掩码与标志

基本类型 / 数字 / 整型

//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);