C++ 16进制和2进制的妙用(一个参数实现同时汇报多个状态)

来源:互联网 发布:网络龙虎斗赌博揭秘 编辑:程序博客网 时间:2024/06/05 06:08

有的时候我们不得不在一步就要告知服务器 或者自己封装的函数很多状态 比如 下面的代码

typedef enum {   ACTION_SHOWCARDS,   ACTION_FOLLOW,   ACTION_ADDANTE,   ACTION_GIVEUP,  ACTION_COMPARE ,} ActionState;
上面代码代表了一个小的状态机枚举,但是如果我想要告诉服务器 现在我的状态时showcards 和 follow 2个状态同时存在时怎么办,最笨的方法是一个数组传递过去,但是如果很多个状态呢。我把代码稍微做一些修改

typedef enum{   ACTION_SHOWCARDS = 0x01,   ACTION_FOLLOW = 0x02,   ACTION_ADDANTE = 0x04,   ACTION_GIVEUP = 0x08,   ACTION_COMPARE = 0x10,} ActionState;

typedef enum {    ACTION_SHOWCARDS = 1,   ACTION_FOLLOW = 1 << 1,    ACTION_ADDANTE = 1 << 2,    ACTION_GIVEUP = 1 << 3,   ACTION_COMPARE = 1 << 4,} ActionState;

把每一个枚举附值

第一种方法是为其负值16进制的数字,而第二种方式是位移符号

比如1的二进制是 0001 而 1<< 1  则是把所有二进制数字向左位移 末尾补0 为 0010 转换为10进制为2 也可以理解为 '<<1' 这个符号就是 * 2的意思 而 << n 就是 2^n 

这些数转换为二进制分别为 0000 0001,0000 0010,0000 0100,0000 1000,0001 0000

当状态机同时处在showcards和follow和addante时 只要做或运算就可 比如

ACTION_SHOWCARDS | ACTION_FOLLOW | ACTION_ADDANTE;

这样对比出来就是二进制的对比或 0000 0111

转换为10进制为7

然后解析的方法是且运算就可

    int  a = ACTION_SHOWCARDS | ACTION_FOLLOW | ACTION_ADDANTE;    printf("%d\n", a);    printf("%d\n", a & ACTION_GIVEUP);    printf("%d\n", a & ACTION_FOLLOW);
可以自己去试试 你会发现如果在之前没有参加或运算的值 会得到0 为 如果参加过或运算的枚举 会得到它本身的数,这样就可以一步告诉服务器或者自己的函数多种状态
                                             
1 0
原创粉丝点击