有这么一个设计需求(为了便于描述问题已经简化):
有八个篮子,编号为abcdefgh,有个管理员管理这八个篮子。有若干普通用户,每个用户手上有多个小球,每个小球的编号不同,每个用户可以向管理员申请将某个球放到某个篮子里,注意是“申请”;管理员可以查看到这些申请,并且可以选择允许或拒绝,申请允许之后小球可以进入指定的篮子,拒绝后该申请用户可以得到一个反馈,并且用户可以及时跟踪申请的状态。
比较直观(是好理解,但并不代表可取)的做法是在一个类设计9个bool变量,前八个记录申请的篮子,第九个:空=申请中、false=拒绝、true=允许。不过这么设计有个很麻烦的地方:如果快速定位一个小球申请的是哪个篮子(这里先假设一个小球只能申请放到一个篮子)。
并不是说这种设计完全不可取,只是这个设计不适合做运算,但是用作显示和存取还是很方便的。下面讨论一下运算的问题。
比较折中的处理方案是用一个short变量(16位bit,除了符号为有15个可用位),但是这里要拿出10个bit位来存储一个申请,8位是记录篮子的(假设这里使用前8位),1个位记录申请成功,1个位记录申请失败(假设使用后两位),如000000010000010代表申请放在h号篮子且申请成功。
那么开始运算。怎么去运算呢?
如果只从结果来看,实现起来并不难,最直观的做法是short之间的相等比较运算,可能具体处理的时候要截取一个short中的某几位会麻烦一点,当然可以写在一个函数中,顺便再自定义一个类把篮子和申请结果单独分开,然后是short到这个类的转换。完成这个构思后,我立刻觉得这么构思很蠢。
首先从根本出发:我们使用的“computer”这种东西最终是以二进制存储的,从最简单的四则运算到科学计算到底层都是封装好的2进制运算。那么问题是:什么运算是效率最好的?比如 ++、--、!,其实也对。不过真正效率最高的是&、|、^、>>、<<之类的运算。
假设需要统计所有申请了a篮子且未审批的球的清单,最好的做法是 (申请码 & (a篮子标识码 | 申请中标识码))>0
有个球,只知道它申请了a篮子,要求将其状态强制改成拒绝,最好的做法是 申请码= ((申请码>>2)<<2)|拒绝标识码 (来回与或了N次的同学可以去面壁了。。。)
有的时候,善于挖掘一些已有的知识,用来提高自己程序的效率,解决一些看似很麻烦的问题,对个人的积累是挺有帮助的。我一直比较推崇在积累的一定的开发经验之后重新翻阅一下以前的基础课本,比如数据库原理、数据结构、面向对象思想、汇编等,会发现你并不是像想象中一样理解某个学科,能够体会到一些更有用的东西,有针对性的看待一些理论知识,让它们为优化程序服务