zoukankan      html  css  js  c++  java
  • 利用位运算实现一个字段表示多个属性

    需求是这样的,我希望使用一个字段来标记多个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类型属性

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

  • 相关阅读:
    rustlang入门教程
    中间件日志切割
    Redis非关系型缓存数据库集群部署、参数、命令工具
    SaltStack自动化软件简介及安装
    CentOS根目录下各目录介绍
    Dockerfile书写介绍及构建ssh镜像、tomcat镜像、nginx镜像
    DockerFile执行报错解决
    阿里云CentOS7.2把默认语言修改成中文
    JavaScript 如何判断一个数据的类型
    MongoDB windows 下安装配置
  • 原文地址:https://www.cnblogs.com/aspirant/p/15030744.html
Copyright © 2011-2022 走看看