巧妙使用位运算(&和|)来处理数据状态,统一快速又方便

作者: admin 分类: 应用技巧 发布时间: 2018-08-14 19:51  阅读: 451 views

这个程序的设计思路是通过位运算(&,|)的原理,实现对数据的状态标记。

其数据具有规律性。相对于一般定义int变量,从1~无穷大作为状态标记的做法,安全性高一些(因为要多一层位运算才能确定状态)。


使用方式如下:

给用户对象定义了多个状态标记

 

Public class userTag{

    //1=卖家标记

    public static final long TAG_SELLER = 1L;

    //2=买家标记

    public static final long TAG_BUYER = 2L;

    //4=客服标记

    public static final long TAG_CUSTOMER = 4L;

    //8=游客标记

    public static final long TAG_TOURIST = 8L;

}

 

用户对象为user

 

场景1:设定用户即是卖家 又是客服

user.setTag( userTag.TAG_SELLER |  userTag.TAG_CUSTOMER);

计算过程如下

userTag.TAG_SELLER         = 1  二进制为 00000010

userTag.TAG_CUSTOMER  = 4 二进制为 00000100

 

|运算【只要其中有一个是1就返回1,否则返回0】

userTag.TAG_SELLER |  userTag.TAG_CUSTOMER = 00000010 |  00000100= 00000110 十进制为5

 

这样得知只要用户tag为5的,就即是卖家也是客服

 

场景2:判断用户是否为客服

if((user.getTag&userTag.TAG_CUSTOMER) == userTag.TAG_CUSTOMER){

//客服业务逻辑

}

a. 假设用户A的tag为5 计算过程如下

  user.getTag                       = 5  二进制为 00000110

  userTag.TAG_CUSTOMER = 4  二进制为 00000100

 

  &运算【两个位都是1才会返回1,否则返回0】

  user.getTag&userTag.TAG_CUSTOMER = 00000100   十进制为 4

  结果就相等,则该用户是客服

 

b. 假设用户A的tag为3计算过程如下

  user.getTag                       = 3  二进制为 00000011

  userTag.TAG_CUSTOMER = 4  二进制为 00000100

 

  user.getTag&userTag.TAG_CUSTOMER = 00000000  十进制为0

  结果不相等,则该用户不是客服

 

 

场景3:判断当前管理员是否拥有买家\卖家\游客的所有权限

Long tag = user.getTag & ( userTag.TAG_SELLER +  userTag.TAG_BUYER + userTag.TAG_TOURIST);或者

Long tag = user.getTag & ( userTag.TAG_SELLER |  userTag.TAG_BUYER | userTag.TAG_TOURIST); 

if(tag==0){

//没有权限

}else{

//有全部或部分权限

}

 

 

计算过程如下

user.getTag                      = 11  二进制为 00001011

userTag.TAG_SELLER      =  1   二进制为 00000001

userTag.TAG_BUYER       =  2   二进制为 00000010

userTag.TAG_TOURIST    = 8   二进制为 00001000

 

  userTag.TAG_SELLER +  userTag.TAG_BUYER + userTag.TAG_TOURIST 

=userTag.TAG_SELLER |  userTag.TAG_BUYER | userTag.TAG_TOURIST

= 00000001 +  00000010 + 00001000 

= 00001011

 

00001011 & 00001011 = 00001011 

说明有权限

 


   原创文章,转载请标明本文链接: 巧妙使用位运算(&和|)来处理数据状态,统一快速又方便

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

更多阅读