对象属性(状态等)位控制方法

引子

编程过程中,我们经常需要用到位来标识对象的属性/状态等行为,下面展示了一个通用做法...

若转载请保证文章完整性及保留博客地址。

改定履历

    

 

正文

 编程过程中,我们经常需要用到位来标识对象的属性/状态等行为.例如:一个果盘,放入苹果则果盘具有苹果属性;放入桔子果盘将有桔子属性;同样,放入香蕉果盘将有香蕉属性.拿出任意水果,果盘将失去相应属性.一般来讲,有三种常用行为:

  • 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->从没有苹果的果盘中拿走苹果.果盘中反倒有苹果了.

所以用异或方式去除属性并不保险,如果一定要用应先确认对象拥有这一属性.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值