利用位运算实现一个字段表示多个属性
属性 实现 一个 利用 多个 运算 表示
2023-09-14 09:02:30 时间
需求是这样的,我希望使用一个字段来标记多个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 ));
其他的新增,修改和查询 也可以参考我上面的代码
相关文章
- Vue专题 02_计算属性(computed) VS 方法(methods)
- 【第六篇】商城系统-实现规格参数和销售属性
- pthread_create 线程属性-Linux学习——线程的创建和回收
- 【HTML】原生属性capture访问相机
- 一文带你了解什么是 " 对象的属性 "
- WordPress 文章查询教程13:WP_Query 类的所有属性
- Vue 指令之v-bind指令绑定属性
- Spring DI(依赖注入)的实现方式:属性注入和构造注入
- JS currentStyle属性和getComputedStyle()方法:读取CSS显示样式
- MySQL建表语句中的自增属性实现(mysql建表语句自增)
- 掌握Oracle字段属性 实现快速数据库操作(oracle字段属性)
- CMDB与MySQL略有不同的属性(cmdb与MySQL区别)
- Oracle中实现属性数据的拆分(oracle中拆分属性)
- ppk谈JavaScriptstyle属性
- js下用层来实现select的title提示属性
- Javascript获取标签ID改变style属性的代码
- js修改input的type属性及浏览器兼容问题探讨与解决
- C#Dynamic关键字之:调用属性、方法、字段的实现方法
- 获取SQLServer表字段的各种属性实例代码
- jQuery实现随意改变div任意属性的名称和值(部分原生js实现)
- jquery得到font-size属性值实现代码
- 如何在JavaScript中实现私有属性的写类方式(一)
- C#中的动态创建组件(属性及事件)的实现思路及方法
- js的Prototype属性解释及常用方法