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的类。
BIT位操作用途
最新推荐文章于 2024-07-19 14:33:42 发布