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
- C++ 16进制和2进制的妙用(一个参数实现同时汇报多个状态)
- 不使用第三个参数和库函数实现两个数字的交换(异或的妙用)
- rvm实现一个系统同时运行多个ruby版本项目(用于解决一个服务器部署多个ruby版本项目的实现)
- rvm实现一个系统同时运行多个ruby版本项目(用于解决一个服务器部署多个ruby版本项目的实现)
- (c#) 使用一个程序同时启动多个程序
- 求助:TelephonyManager.listen 监听使用的问题--如何实现TM同时监控多个状态的改变
- horizon实现多个角色同时拥有一个菜单权限
- ajax+jQuery实现一个页面同时加载多个模块!
- ajax+jQuery实现一个页面同时加载多个模块!
- jquery/js实现一个网页同时调用多个倒计时(最新的)
- 一个方法最多2个线程同时使用的JAVA实现
- Socket编程服务器和客户端(多个客户端可以同时连接一个服务器的同一端口)
- Socket编程服务器和客户端(多个客户端可以同时连接一个服务器的同一端口)
- Socket编程服务器和客户端(多个客户端可以同时连接一个服务器的同一端口)
- iOS FMDB同时修改多个参数的值
- 很有意思的一个系统,在线客服,访客同时可以和多个客服进行咨询
- 树莓派3b实现多个功能模块同时运行入门(C语言多线程)
- linux c的连接库和怎么同时编译多个源程序
- 安装kafka以及kafka的简单运行
- Android自动化测试框架Espresso(三)——View Action的使用
- mysql 筛选数据大于等于日期不出来数据的原因
- 架构师知识体系(1)--WEB架构师成长之路
- 进阶篇_vector容器
- C++ 16进制和2进制的妙用(一个参数实现同时汇报多个状态)
- vim简单使用教程
- SqlServer存在就更新,不存在就插入的写法
- 根据经纬度和公里范围检索附近所有资源
- Android系统移植与调试之-------)如何添加一个adb wifi无线调试的功能【开发者选项】-【Wifi调试】
- spring aop xml配置事务
- jquery的join函数
- spring 框架说明文档学习记录(3.1)
- 编译原理——词法分析(1)