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

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clever101

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值