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的類。