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

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



  • 相关阅读:
    图片预览神器
    近期错题总结
    鬼谷子的钱袋(lgP2320)
    小明的账单
    合并果子(lgP1090)
    看病
    稀有矿井
    舞会(lgP1352)
    三国风云
    天上掉 Pizza
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6470971.html
Copyright © 2020-2023  润新知