Unity心得(1)-使用一个整数保存状态
2016-09-25 15:42
260 查看
前言
使用习惯了unity和c#,有时候可能会忽略掉一些当初学习C/C++小技巧,最近开发项目的时候,项目组那些有经验的前辈介绍了有关使用一个整数保存多个状态的方法,使用的就是以前C/C++中常用的位运算。使用场景
先试想一个场景,比如一个套装装备有十多个插槽,需要检测这些插槽是否插有加成的宝石,就需要十多个变量来代表有或者没有,使用多个bool变量或者int数组,显得结构臃肿且难以管理,既然只是表示有或者无,那么用0,1就可以表示,所以想到使用二进制来表示这些变量。具体方法
所以,设置一个int类型的状态变量int slotState = 0;
好了,现在我们在插槽全空的状态下在3号插槽插上了一个加成宝石,用二进制表示就应该是100,即第三号插槽有宝石,显然,不能直接写slotState = 4,这样就失去了我们使用这种方法的初衷,应该按照下面的这样写。
slotState = slotState|(1<<2)
其中1<<2 是按照二进制计算的,1<<2 = 100,将slotState = 000与100进行“|”或运算,则得到100,可以这个slotState的第三位已经被置为1了。系统因此可以记录三号插槽已经使用。
那么相应的,我们也需要检测插槽的使用,比如有用户试图在3号插槽安装宝石,那么假设
slotState = 20;
20的二进制为10100,那么相应的即为3、5号插槽是有宝石的,那么因为用户尝试使用3号插槽,那么我检测3号插槽使用如下方法。
bool isSlotUsed = ((slotState >> 2) %2 == 0);
其中slotState >> 2,使得slotState = 101,此时对2取余,因为最后一项为1,所以取余结果为0,那么isSlotUsed为真,证明该插槽被使用。
以上就是最近学习到的一个小技巧,当然这个小技巧有个限制,倘若状态变量(比如此例中的slotState)是带符号的int,那么无论其为32位或者64位,其中的最后一位都是符号位,不要占用该位来保存状态,否则容易出错,失去这个状态变量的唯一性。
相关文章推荐
- 使用一个整数字段保存多个状态位数据
- stat函数的使用 获取文件状态 可以将文件状态复制保存在一个stat结构地址中,以此取得文件的大小等状态
- 使用递归将一个整数各个数字保存到一个数组中
- 从工作流状态机实践中总结状态模式使用心得
- webservice中使用Session保存用户状态
- VisualState“视图状态”使用心得
- 出现"会话状态已创建一个会话ID,但由于响应已被应用程序刷新而无法保存它" 解决方案
- VC计时器的一个使用心得
- ASP.NET WEB群集使用SQL Server保存状态
- 使用 StateServer 持久保存 Session 会话状态 !
- VC计时器的一个使用心得
- 使用SQL Server保存Session状态,实现单点登录
- 使用流加载和保存HTML内容&遍历html的信息存入一个ini文件&使用MSHTML分析HTML代码
- 完成了WF工作流持久化和对持久化介质数据的加载, 但是仅仅用持久化,不能够保存工作流当前的执行状态,需要跟踪服务支持,怎样使用Tracing 服务呢?
- 讨论:一个类的方法应该使用返回值来标识执行状态,还是抛出异常?
- GridView中添加一个CheckBox列,翻页后保存选中状态
- 使用流加载和保存HTML内容&遍历html的信息存入一个ini文件&使用MSHTML分析HTML代码
- Java得到一个整数的绝对值,不使用任何判断和比较语句,包括API.
- 转发一个Asp.NET 操作配置文件的使用心得
- 使用ExtJs开发MIS系统(3):使用数据库保存客户端状态