程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> bitset類的一個應用場合——充當掩碼

bitset類的一個應用場合——充當掩碼

編輯:關於C語言

作者:朱金燦

      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);

這下代碼就簡潔和清晰多了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved