利用位运算实现一个字段表示多个属性

需求是这样的,我希望使用一个字段来标记多个boolean属性, 不能使用json的形式,因为使用opensearch 不能通过json解析,但是可以使用位操作运算符号,

如果不熟悉位运算符号参考:Java的位运算符详解实例——与(&)、非(~)、或(|)、异或(^)

网上参考了很多,发现 明明是个小问题,但是大部分实现却都有问题,在此记录一下,需要的可以直接拷走,

import java.util.Objects;

/**
 * 
 *
 *  
 */
public enum PerformChannelRuleFlagEnum {
    /**
     * 1表示可以修改价格、2表示可以修改票面模板
     */
    CAN_MODIFY_TICKET_PRICE(1<<0, "允许修改票面价格"),
    CAN_MODIFY_TICKET_TEMPLATE(1<<1, "允许修改票面模板"),
    IS_DIST_PROJECT(1<<2, "是否是分销来的项目, 非当前商户项目"),
    ;

    private Integer code;

    private String desc;

    PerformChannelRuleFlagEnum(int val, String desc) {
        this.code = val;
        this.desc = desc;
    }

    public Integer getCode() {
        return code;
    }

    public String getDesc() {
        return desc;
    }

    public static CertificateTypeEnum getEnum(int code) {
        for (CertificateTypeEnum e : CertificateTypeEnum.values()) {
            if(e.getCode().equals(code)){
                return e;
            }
        }
        return null;
    }
  //判断是否存在
    public static boolean existFlag(Integer src, PerformChannelRuleFlagEnum e) {
        if (Objects.isNull(src)) {
            return false;
        }
        return (src & e.getCode()) > 0;
    }

   //添加指定属性
    public static int addFlag(Integer src, PerformChannelRuleFlagEnum e) {
        if (Objects.isNull(src)) {
            return 0 | e.getCode();
        }
        return src | e.getCode();
    }

   //修改指定属性  used就是指定的属性值;
    public static int withBoolFlag(Integer src, boolean used, PerformChannelRuleFlagEnum e) {
        if (used) {
            return addFlag(src, e);
        }
        return removeFlag(src, e);
    }

  //删除指定属性
    public static int removeFlag(Integer src, PerformChannelRuleFlagEnum e) {
        if (Objects.isNull(src)) {
            return 0;
        }
        return src & ~e.getCode();
    }

}

 

 

 

 不熟悉的位运算的,可以看看下面的文章,

注意删除的算法他们都有问题,我在上面的代码中给出来删除的实例,可以参考上面的实例;

 

这是测试类:

   int src=1;

        SaleRuleEnum ac=SaleRuleEnum.HAS_UP_PRICE;

       int value= SaleRuleEnum.addFlag(src, SaleRuleEnum.HAS_UP_PRICE);

        System.out.println(value+"二进制="+Integer.toBinaryString(value ));

        value= SaleRuleEnum.withBoolFlag(value,true, SaleRuleEnum.HAS_UP_PRICE);

        System.out.println(value+"二进制="+Integer.toBinaryString(value ));

        value= SaleRuleEnum.withBoolFlag(value,false, SaleRuleEnum.HAS_UP_PRICE);

        System.out.println(value+"二进制="+Integer.toBinaryString(value ));

        value= SaleRuleEnum.removeFlag(value,SaleRuleEnum.HAS_UP_PRICE);

        System.out.println(value+"二进制="+Integer.toBinaryString(value));

        value= SaleRuleEnum.addFlag(src, SaleRuleEnum.HAS_UP_PRICE);

        System.out.println(value+"二进制="+Integer.toBinaryString(value ));

        value= SaleRuleEnum.withBoolFlag(value,false, SaleRuleEnum.HAS_UP_PRICE);

        System.out.println(value+"二进制="+Integer.toBinaryString(value ));

 

 

其他的新增,修改和查询 也可以参考我上面的代码 

参考:利用位运算符实现一个字段表示多个bool类型属性

参考:利用位运算实现一个字段表示多个属性

posted @ 2021-07-19 16:16  aspirant  阅读(342)  评论(0编辑  收藏  举报