作者:朱金燦
STL中的bitset類平時我較少用到,今天發現用它來充當掩碼非常合適。這裡的所說的掩碼是指一個int值來涵蓋多種情況。其實這種掩碼我們也經常遇到過。比如MFC程序中的窗口類CWnd類的鼠標移動消息處理函數:
afx_msg void OnMouseMove(
UINT nFlags,
CPoint point
);
該函數的第一個參數UINT nFlags就可以稱為一個掩碼。這個掩碼涵蓋了在移動鼠標時用戶是否同時還按下了鼠標左鍵、鼠標右鍵等多種情況。其實這還算是簡單的,因為這只是一個組合鍵的問題。現在存在多種可能組合的情況。比如在一個二維圖形編輯軟件,使用鼠標點選圖形編輯,每次只能選一個圖形。現在所有的點圖形放在點數組,所有線圖形放在線數組。要實現點選圖形,得先設定一個阈值,確保在一定范圍內選中。一種通常的做法是:
先遍歷點數組,找出鼠標點到某一點的距離最小而且小於阈值;同時遍歷線數組,找出鼠標點到某一條線的距離最小而且小於阈值。這樣就有了四種情況:
1. 沒有符合條件的點或線被鼠標選中
2. 在點組找到符合條件的點,但在線組中沒有找到符合條件的線
3. 在線組找到符合條件的線,但在點組中沒有找到符合條件的點
4. 同時在點組找到符合條件的點和在線組找到符合條件的線,這種情況下要比較鼠標離點的距離較近還是離線的距離更近。
如何涵蓋這四種情況呢?如果定義一個int變量來保存這四種情況,我們估計得寫一大堆if和else語句:
UINT nFlag;
if(假如都沒找到符合條件圖形)
nFlag = 0;
else if(假如只找到點) // 在找到點的同時需要判斷是否找到線
nFlag = 1;
else if(假如只找到線)
nFlag = 2;
else if(同時找到點和線)
nFlag = 3;
四種情況算少的,假如組合情況一多,估計你要暈頭轉向了,而且代碼也極不清晰。
現在讓我們使用bitset類來處理這種情形。
// 定義一個bitset類對象,初始二進制值為:00
bitset<2> RetBit;
// 如果找到點,就設置第一個二進制位為1,這裡只須判斷是否找到點,別的不管
if(假如找到點)
RetBit.set(0);
// 如果找到線,就設置第二個二進制位為1,這裡只須判斷是否找到線,別的不管
if(假如找到線)
RetBit.set(1);
這下代碼就簡潔和清晰多了。