蜉蝣之翼❉ 2022-02-14 22:03 采纳率: 100%
浏览 26
已结题

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,
吗?

  • 写回答

2条回答 默认 最新

  • 关注

    不可以,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...这样的,不容易出错,也更直观。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 2月24日
  • 已采纳回答 2月16日
  • 创建了问题 2月14日