引子
编程过程中,我们经常需要用到位来标识对象的属性/状态等行为,下面展示了一个通用做法...
若转载请保证文章完整性及保留博客地址。
改定履历
正文
编程过程中,我们经常需要用到位来标识对象的属性/状态等行为.例如:一个果盘,放入苹果则果盘具有苹果属性;放入桔子果盘将有桔子属性;同样,放入香蕉果盘将有香蕉属性.拿出任意水果,果盘将失去相应属性.一般来讲,有三种常用行为:
- 1. 增加某一属性----------如在果盘中放入苹果,增加苹果属性.
- 2. 确认是否有某一属性----如确认果盘中是否有桔子
- 3. 去除某一属性----------如拿掉果盘中的香蕉
我们做如下宏定义:
#define NO_ANY_FRIUTES 0X0000 0000 //! 表示果盘中没有任何水果
#define FRIUTES_APPLE 0X0000 0001 //! 表示果盘中有苹果
#define FRIUTES_ORANGE 0X0000 0002 //! 表示果盘中有桔子
#define FRIUTES_BANANA 0X0000 0004 //! 表示果盘中有香蕉
int nFriutes = NO_ANY_FRIUTES; //! 初始化果盘中没有任何水果
●增加属性(位或)
nFriutes |= FRIUTES_APPLE; //! 果盘中增加苹果属性
●确认属性(位与)
if (FRIUTES_APPLE == (nFriutes & FRIUTES_APPLE))
{
cout << "果盘中有苹果" << endl;
}
●去除属性(按位取反再相位与)
nFriutes &= ~(FRIUTES_APPLE); //! 从果盘中拿走苹果
★第三种"去除属性"的行为,可能有同学会用到"异或",理由是这样的:
假设现在:
nFriutes = 0X0000 0011; //! 果盘里有苹果和桔子
nFriutes ^= FRIUTES_APPLE; //! nFriutes == 0X0000 0010->果盘中只有桔子了.
上面结果好像是正确的,其实是不对的,如下:
假设现在:
nFriutes = NO_ANY_FRIUTES; //! 果盘中没有任何水果
nFriutes ^= FRIUTES_APPLE; //! 结果nFriutes == 0X0000 0001->从没有苹果的果盘中拿走苹果.果盘中反倒有苹果了.
所以用异或方式去除属性并不保险,如果一定要用应先确认对象拥有这一属性.