bitset类的一个应用场合——充当掩码

作者:朱金灿
来源:http://blog.csdn.net/clever101/


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

这下代码就简洁和清晰多了。



原文地址:https://www.cnblogs.com/lanzhi/p/6470971.html