C++ 代码 APP_GAME_MGR = 1 << 1 这么写的目的

正在阅读一段游戏代码
enum APP_TYPE
{
    // APP_Global 和 APP_None 值相同, APP_Global 只用于读取配置
    APP_None = 0,
    APP_Global = 0,

    APP_DB_MGR = 1,
    APP_GAME_MGR = 1 << 1,
    APP_SPACE_MGR = 1 << 2,

    APP_LOGIN = 1 << 3,
    APP_GAME = 1 << 4,
    APP_SPACE = 1 << 5,
    APP_ROBOT = 1 << 6,

    APP_APPMGR = APP_GAME_MGR | APP_SPACE_MGR,

    APP_ALL = APP_DB_MGR | APP_GAME_MGR | APP_SPACE_MGR | APP_LOGIN | APP_GAME | APP_SPACE,
};


不明白为什么要这么写

不能写成
APP_DB_MGR = 1,
APP_GAME_MGR = 2,
APP_SPACE_MGR = 3,
吗?

不可以,APP_APPMGR 和APP_ALL 需要用到上面的枚举类型做或运算(按位或运算)。
<<1的意思是左移1位

APP_DB_MGR = 1,
APP_GAME_MGR = 1 << 1,
APP_SPACE_MGR = 1 << 2,

APP_LOGIN = 1 << 3,
APP_GAME = 1 << 4,
APP_SPACE = 1 << 5,
APP_ROBOT = 1 << 6,

相当于:

APP_DB_MGR = 0x0000 0001,
APP_GAME_MGR = 0x0000 0010,
APP_SPACE_MGR = 0x0000 0100,

APP_LOGIN = 0x0000 1000,
APP_GAME = 0x0001 0000,
APP_SPACE = 0x0010 0000,
APP_ROBOT = 0x0100 0000,

这样按位做或运算的时候,就不会出现重复的值。
比如 APP_APPMGR = APP_GAME_MGR | APP_SPACE_MGR的值就是
APP_APPMGR = 0x0000 0010 | 0x0000 0100 = 0x0000 0110

至于 APP_GAME_MGR = 1 << 1,为什么不写成 APP_GAME_MGR = 0x0000 0001,这种样式,是因为,用1 << 1比用0x0000 0001更简洁,也不容易出错。当枚举元素多的时候,需要一个一个改数字1的位置,而如果用1<<1这种方式,只需要把<<右侧的1改成2、3、4、5...这样的,不容易出错,也更直观。

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632