网站建议:179001057@qq.com

BIT位操作用途

技术2022-05-11  1

Bit的思路是很自然而且紧凑的。 1.如果业务数固定,比如少于32项业务,那么一个32位的整型值足以表达: 定义枚举类型: enum Business { BUSINESS_1 = 0x00000001; BUSINESS_2 = 0x00000002; BUSINESS_3 = 0x00000004; BUSINESS_4 = 0x00000008; BUSINESS_6 = 0x00000010; BUSINESS_7 = 0x00000020; ... BUSSNESI_32 = 0x80000000; } 则可进行如下的组操作: Business businessGroup = BUSINESS_1 | BUSINESS_6 | BUSINESS_23; // 创建一个业务组,包含了业务1,业务6和业务23 businessGroup |= BUSINESS_19; // 添加业务19至该业务组中 if (businessGroup & BUSINESS_21) ... // 判断业务21是否在该组中 businessGroup &= ~BUSINESS_6; // 从该组中删除业务6 businessGroup ^= BUSINESS_9; // “反转”操作:如果业务9在组中,则从组中删除之;否则将业务9加入组中。 businessGroup = 0; // 清空所有业务 businessGroup = ~0U; // 添加所有业务 2.如果如楼主所言,业务数量不固定,甚至有可能在运行期动态增加业务的话,那么一个基本的数值肯定已经无法满足需求。可以封装一个class来处理这样的情况。 如果考虑到节省空间,建议楼主可以用C++的vector 来创建一个bool类型的vector: vector businessGroup; businessGroup.resize(100); // 该组可包含100项业务 businessGroup[10] = true; // 将业务10加入该组 businessGroup[15] = false; // 将业务15从组中删除 businessGroup.resize(150); // 动态增加业务总数至150 ... 之所以使用vector ,有一个好处就是C++特别对vector 做了存储优化:用一个bit来表示一个元素。因此理论上一个包含32元素size的vector 在元素存储方面只占用32位也就是四个字节的空间,和你用一个整数表示的效率是一样的。(当然具体编译器可能会安插一些用于对齐的bits或额外的class信息等.) 这个方式兼具效率与直观度,楼主不妨考虑将其封装成为一个BusinessGroup的类。

最新回复(0)