有的时候我们不得不在一步就要告知服务器 或者自己封装的函数很多状态 比如 下面的代码
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 为 如果参加过或运算的枚举 会得到它本身的数,这样就可以一步告诉服务器或者自己的函数多种状态