java bit mask_位掩码(Bit Mask)的应用

刚开始做java,本文的也是以一个小白的角度,所以不足之处还请谅解。

书归正传,先说下背景,项目中需要添加一个功能是在管理系统中添加一个邮件管理,这个管理可以让用户决定几种类型的邮件接收与否。

每个用户可以在自己的后台进行设置,比如现在有4种类型的邮件emailTypeA,  emailTypeB,  emailTypeC,  emailTypeD .

我在后台用户表添加了4个字段,属性true或false,这个每个用户可以设置修改自己的邮件接收与否。

做完后,用户那边的后台提出个问题,如果邮件类型在多一种或者几种的话,那必然要去修改数据库,后台代码和前端代码,提出了使用位掩码来实现,然后就去查了查位掩码,真的发现是一种比较好的思路。

位掩码,说白了是应用位运算来实现一些复杂的操作,利用二进制的1和0来实现。位运算的效率也会高很多。

比如刚才说的4种属性,那么我就可以用4位的二进制就可以实现了,每一位都可以为0或者1,0为false,1为true,true和false决定接受与否,如果多加一个或多个属性,无非前面的二进制的一堆0的某一位换个1而已。

这样我在数据库里添加了一个字段 emialType,类型为integer

主要是怎么利用位运算进行操作了

1、获取,怎么利用获取出来的整数来确定各个属性

比如取出来的值为12,二进制位1100,也就是4个属性分别为 false,false,true,true。问题是怎么用代码(位运算)

那我们来看第一个属性的值 = 1100 位与 0001 值为 0000 与0001比较为false

第二个属性的值 = 1100 位与 0010 的值 0000 与0010比较为false

第三个属性的值 = 1100 位与 0100 的值 0100 与0100比较为true

第四个属性的值 = 1100 位与 1000 的值 1000 与1000比较为true

也就是第i个属性的值为

(emaiType & (1 << i) == ( 1 << i))

2    设置 , 使用位掩码的这几个属性也就是有2个值0 和 1,true和false。

我们要设置这些属性的话就是把这个值的二进制的对应位取反

比如设置第二个属性,原值十进制为11, 二进制位 1011,也就是改成1001

用位运算怎么实现呢,这个实现想了很久,还找到网上又对这个实现进行封装了方法的, 后来发现位运算的异或其实可以直接实现某一位的取反操作。

原值11   二进制   1011

第二个属性取反    也就是 用1011 与 1(1 <<1)(0001) 异或就可以了, 异或的规则是同0异1

1011

^  0001

== 1010   刚好取反

再比如第三位取反

1011

^ 0100 (1 <<2 )

== 1111

我们来分析这个异或的实现,实现某一位的取反就是1 移位到这一位,也就是二进制这一位为1,其他位位0

开始分析,其他位:   用0去异或,如果原值为1,不同为1,原值不变,如果原值为0,相同为0,原值不变,也就是其他位保持不变。

要修改的位:   用1去异或,如果原值为1,相同为0 , 原值改变 ,如果原值为0, 不同为1,原值改变,可见用异或可以实现指定位的取反。

第i个属性的修改为

emaiType ^ ( 1 << i)

默认值的设置,我这是4个属性,我设置了15,可是如果以后属性添加的话又得需要改了,高人提供的方法,设置 -1, -1的二进制全是1☺你们懂得

上面只是介绍了这种思路和使用的方法,具体使用在这就不献丑了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值