通过位运算打多个标记

通过位运算打多个标记

如何在一个字段上,记录多个标记?

如何在一个字段上,记录不同类型的多个标记?

如何用较少的字段,记录多个标记?

如何在不增加字段的要求下,记录新增的标记?

在实际的开发中,经常有这样的需求,需要用尽可能少的字段,记录多个标记?

比如交易中一个订单,是否发生过支付?是否进行过发货?是否发生过退货退款?是否进行过理赔?

比如社交中一个帖子,是否审核通过?是否被举报过?是否发生过二次编辑,是否要置顶等等

以上场景,最终都是要记录到数据库中的。如果每增加一个类型,都增加一个字段标记是或者否的话,那每行记录的字段数,得增加到多少?

所以我们的诉求是希望通过尽可能少的字段,最好是不要增加数据库的字段,能够记录同时记录多个标记。

这样的场景,一种解决方式是:在数据库中增加一个内容是JSON格式的字段,然后每次往JSON中增加内容。这种方式的好处是比较灵活,增加标记不用修改数据库DDL。而且不需要记录的标记可以不存储,不用占用存储空间。但文本格式毕竟会占用较多的存储空间,随着标记的增加,类似MySQL数据库可能需要调整字符串长度

另一种解决方式是位运算,通过在不同的位置填充0或者1,表示标记的是或者否,有或者没有。大名鼎鼎的布隆过滤器,实现原理也是类似的

比如说一个订单,我们需要记录它是否发生过支付?是否发生过发货?是否发生过退货?那么就可以设计这么几个标记

PAY_FLAG(1L << 1L),
DELIVER_FLAG(1L << 2L),
REFUNR_FLAG(1L << 3L),

然后在订单表中增加一个flag​字段,通过位运算,记录订单的不同标记。方法如下

// 设置Flag
public static Long setFlag(Long orderFlag, OrderFlagEnum orderFlagEnum) {orderFlag |= orderFlagEnum.getFlag();return orderFlag;
}
// 清除Flag
public static Long clearFlag(Long orderFlag, OrderFlagEnum orderFlagEnum) {orderFlag &= ~orderFlagEnum.getFlag();return orderFlag;
}// 判断是否设置过某个Flag
public static boolean hasFlag(OrderFlagEnum orderFlagEnum, Long orderFlag) {return (orderFlag & orderFlagEnum.getFlag()) != 0;
}

引申一下,如果需要在一个字段中,记录多个标记,通过位运算,又该怎么实现呢?

比如说想要在一个字段中,记录两个标记。

还是可以通过不同位置标记1还是0实现,比如一个Long型标记,可以在低53位记录一个标记,在高10位记录另一个标记。

// 初始标记
Long flag = 0L;
// 低位需要记录的标记
Long lowFlag = 1L << 11L;
// 高位需要记录的标记
Long highFlag = 1L << 3L;// 设置低位的标记
flag |= lowFlag;
// 设置高位的标记
flag |= (highFlag << 53);// 判断是否设置低位标记
System.out.println((flag & lowFlag) != 0);// true
// 判断是否设置高位标记
System.out.println((flag >> 53L & highFlag) != 0); // true

同理,如果需要在一个字段记录多个标记,只需要划分不同的标记区间就可以了。

比如Java中的读写锁ReentrantReadWriteLock,就是通过在内部表示锁状态的state变量上的低16位,表示写锁,高16位,表示读锁

这里为什么这么设计呢?而不是维护一个读锁,一个写锁?是因为通过CAS的方式,无法一次性操作两个变量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/74538.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle数据库连接之TNS-03505_无法解析服务名异常

在进行数据库开发的时候&#xff0c;通常需要连接Oralce数据库&#xff0c;在进行连接时&#xff0c;经常性的会提示TNS-03505: Failed to resolve name&#xff08;无法解析服务名&#xff09;&#xff0c;从而导致无法连接到数据库实例&#xff0c;那么通过本文对造成该问题的…

SpringMVC之文件上传下载以及jrebel的使用

目录 一、文件上传 1.1 导入依赖 1.2 配置文件上传解析器 1.3 配置服务器存放文件地址 1.3.1 点击编辑Configurations 1.3.2 将项目部署至tomcat服务器上 1.3.3 配置相对路径 1.4 导入PropertiesUtil工具类 1.5 编写resource.properties 1.6 添加sql 1.7 编写PageCo…

GIT高级使用技巧

GIT高级使用技巧 导出GIT日志到文件 按照 <哈希> - <作者名> <作者邮箱地址> - <作者日期> : <commit描述> 的格式导出日志 git log --prettyformat:"%H - %an <%ae> - %ad : %s" master > log.txt筛选日志并按照从旧到新…

2022年12月 C/C++(七级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:走迷宫 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走;有的格子是空地,可以走。 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。 时间限制:1000 …

pandas笔记:显示中间的省略号

比如我们有这样一个数据&#xff08;Geolife中的数据&#xff09; 如何把中间的省略号完整地输出呢&#xff1f; pd.set_option(display.max_rows, None) data

机器人中的数值优化(十五)——PHR增广拉格朗日乘子法

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考&#xff0c;主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等&#xff0c;本系列文章篇数较多&#xff0c;不定期更新&#xff0c;上半部分介绍无约束优化&#xff0c;…

Stable Diffusion 免费升级 SDXL 1.0,哪些新特性值得关注?体验如何?5 分钟带你体验!

一、引言 7 月 26 日&#xff0c;Stability AI 发布了 SDXL 1.0&#xff0c;号称目前为止&#xff0c;最厉害的开放式图像生成大模型。 它到底有没有网上说的那么炸裂&#xff1f;真的已经实现了像 midjourney 一样 靠嘴出图 的功能吗&#xff1f;相对于之前的版本&#xff0c;…

专业的视觉特效处理包,FxFactory 8 Pro for Mac助您打造精彩视频

FxFactory 8 Pro for Mac是一款强大的视觉特效处理包&#xff0c;专门为Mac用户设计。它集成了超过200种高质量的视觉效果和过渡效果&#xff0c;可以轻松地应用于各种视频项目中。该软件提供了一个直观的界面&#xff0c;用户可以通过简单拖放操作将特效应用到视频片段上。它支…

lv4 嵌入式开发-3 标准IO的读写

目录 1 标准I/O – 读写流 2 标准I/O – 按字符输入 3 标准I/O – 按字符输出 4 标准I/O – 思考和练习 5 标准I/O – 按行输入 6 标准I/O – 按行输出 7 标准I/O – 思考和练习 1 标准I/O – 读写流 流支持不同的读写方式: 读写一个字符&#xff1a;fgetc()/fputc()一…

oracle将一个用户的表复制到另一个用户

注&#xff1a;scott用户和scott用户下的源表&#xff08;EMP&#xff09;本身就有&#xff0c;无需另行创建。 GRANT SELECT ON SCOTT.emp TO BI_ODSCREATE TABLE ODS_EMP AS SELECT * FROM SCOTT.emphttp://www.bxcqd.com/news/77615.html SQL语句查询要修改密码的用户…

逻辑回归Logistic

回归 概念 假设现在有一些数据点&#xff0c;我们用一条直线对这些点进行拟合&#xff08;这条直线称为最佳拟合直线&#xff09;&#xff0c;这个拟合的过程就叫做回归。进而可以得到对这些点的拟合直线方程。 最后结果用sigmoid函数输出 因此&#xff0c;为了实现 Logisti…

Mybatis核心对象及工作流程

目录 一、mybatis核心对象 &#xff08;1&#xff09;SqlSession对象直接操作数据库 &#xff08;2&#xff09;SqlSession对象通过代理对象操作数据库 二、mybatis工作流程 一、mybatis核心对象 &#xff08;1&#xff09;SqlSessionFactoryBuilder SqlSession工厂构建者对…

Fine-tuning Large Enterprise Language Models via Ontological Reasoning

本文是LLM系列文章&#xff0c;针对《Fine-tuning Large Enterprise Language Models via Ontological Reasoning》的翻译。 基于本体论推理的大型企业语言模型微调 摘要1 引言2 微调LLM的神经符号管道3 通过概念证明进行初步验证4 结论 摘要 大型语言模型&#xff08;LLM&am…

创建简单的 Docker 数据科学映像

推荐&#xff1a;使用NSDT场景编辑器快速搭建3D应用场景 为什么选择 Docker for Data Science&#xff1f; 作为一名数据科学家&#xff0c;拥有一个标准化的便携式分析和建模环境至关重要。Docker 提供了一种创建可重用和可共享的数据科学环境的绝佳方法。在本文中&#xff…

Openharmony3.2 源码编译(ubuntu 22.04) 过程记录

OS: ubuntu 22.04 x64 1. 下载源码 1.1 安装码云repo工具 sudo apt install python3-pip git-lfsmkdir ~/bin curl https://gitee.com/oschina/repo/raw/fork_flow/repo-py3 -o ~/bin/repo chmod ax ~/bin/repo pip3 install -i https://repo.huaweicloud.com/repository/p…

详解TCP/IP协议第二篇:OSI参考模型详解

文章目录 写给自己的话 一:协议分层与OSI参考模型 二:通过对话理解分层 三:OSI参考模型

飞腾 kylin-server v10 arm64 aarch64 anaconda3 conda 非法指令 Illegal instruction 笔记

原因&#xff1a; chenghlee commented on Jun 15, 2021 Its likely related to the compiler options used to build the linux-aarch64 packages on defaults; basically, Anaconda uses options that target the server-class Neoverse N1/N2 microarchitecture, rather th…

树的引进以及二叉树的基础讲解——【数据结构】

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 当我们学习完前面的数据结构&#xff0c;难度也就会上升&#xff0c;但是这个也是非常重要的数据结构。今天我们来学习一种新的数据类型——树。 目录 树的概念以及结构 树的概念 树的相关概念 树的表示 树在实…

Java——》Synchronized和Lock区别

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

Socks5 与 HTTP 代理在网络安全中的应用

目录 Socks5和HTTP代理在网络安全中的应用。 Socks5代理和HTTP代理的优点和缺点。 选择合适的代理IP需要考虑的因素&#xff1a; 总结 在网络安全领域中&#xff0c;Socks5和HTTP代理都扮演着重要的角色。作为两种不同的代理技术&#xff0c;它们在网络安全中的应用各有特点…