美文网首页后端
位掩码(Bit Mask)的应用

位掩码(Bit Mask)的应用

作者: avery1 | 来源:发表于2017-08-18 10:49 被阅读0次

    刚开始做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☺你们懂得

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

    参考文档: Bit mask in java

    相关文章

      网友评论

        本文标题:位掩码(Bit Mask)的应用

        本文链接:https://www.haomeiwen.com/subject/gknnrxtx.html