利用位运算实现一个字段表示多个属性
需求是这样的,我希望使用一个字段来标记多个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 ));
其他的新增,修改和查询 也可以参考我上面的代码
本文来自博客园,作者:aspirant,转载请注明原文链接:https://www.cnblogs.com/aspirant/p/15030744.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?