当前位置: 首页 > news >正文

通过位运算打多个标记

通过位运算打多个标记

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

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

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

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

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

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

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

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

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

这样的场景,一种解决方式是:在数据库中增加一个内容是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的方式,无法一次性操作两个变量

相关文章:

通过位运算打多个标记

通过位运算打多个标记 如何在一个字段上&#xff0c;记录多个标记&#xff1f; 如何在一个字段上&#xff0c;记录不同类型的多个标记&#xff1f; 如何用较少的字段&#xff0c;记录多个标记&#xff1f; 如何在不增加字段的要求下&#xff0c;记录新增的标记&#xff1f; 在实…...

[学习笔记]Node2Vec图神经网络论文精读

参考资料&#xff1a;https://www.bilibili.com/video/BV1BS4y1E7tf/?p12&spm_id_frompageDriver Node2vec简述 DeepWalk的缺点 用完全随机游走&#xff0c;训练节点嵌入向量&#xff0c;仅能反应相邻节点的社群相似信息&#xff0c;无法反映节点的功能角色相似信息。 …...

C# Linq源码分析之Take(五)

概要 本文在C# Linq源码分析之Take&#xff08;四&#xff09;的基础上继续从源码角度分析Take的优化方法&#xff0c;主要分析Where.Select.Take的使用案例。 Where.Select.Take的案例分析 该场景模拟我们显示中将EF中与数据库关联的对象进行过滤&#xff0c;然后转换成Web…...

性能监控-grafana+prometheus+node_exporter

Prometheus是一个开源的系统监控和报警工具。它由SoundCloud开发并于2012年发布&#xff0c;后来成为了一个独立的开源项目&#xff0c;并得到了广泛的应用和支持。 Prometheus的主要功能包括采集和存储各种系统和应用程序的监控数据&#xff0c;并提供强大的查询语言PromQL来…...

(STM32H5系列)STM32H573RIT6、STM32H573RIV6、STM32H573ZIT6嵌入式微控制器基于Cortex®-M33内核

一、应用 工业&#xff08;PLC、工业电机控制、泵和压缩机&#xff09; 智能家居&#xff08;空调、冰箱、冰柜、中央警报系统、洗衣机&#xff09; 个人电子产品&#xff08;键盘、智能手机、物联网标签、跟踪设备&#xff09; 智能城市&#xff08;工业通信、照明控制、数字…...

mysql配置bind-address不生效

1、前言 因为要ip直接访问mysql&#xff0c;故去修改bind-address参数&#xff0c;按照mysql配置文件查找顺序是&#xff1a;/etc/my.cnf、/etc/mysql/my.cnf、~/.my.cnf&#xff0c;服务器上没有 /etc/my.cnf文件&#xff0c;故去修改 /etc/mysql/my.cnf文件&#xff0c;但是一…...

Linux相关指令(下)

cat指令 查看目标文件的内容 常用选项&#xff1a; -b 对非空输出行编号 -n 对输出的所有行编号 -s 不输出多行空行 一个重要思想&#xff1a;linux下一切皆文件&#xff0c;如显示器文件&#xff0c;键盘文件 cat默认从键盘中读取数据再打印 退出可以ctrlc 输入重定向<…...

Codeforces Round 855 (Div 3)(A - F)

Codeforces Round 855 (Div. 3)&#xff08;A - F&#xff09; Codeforces Round 855 (Div. 3) A. Is It a Cat?(思维) 思路&#xff1a;先把所有字母变成小写方便判断 &#xff0c; 然后把每一部分取一个字母出来 &#xff0c; 判断和‘meow’是否相同即可。 复杂度 O ( n…...

Friend.tech(FT):社交媒体金融的未来,真的如此美好吗?

Friend.tech&#xff08;FT&#xff09;是一个在2023年8月10日正式推出的社交金融平台&#xff0c;它的特点在于允许用户购买和出售创作者的股票&#xff08;shares&#xff09;&#xff0c;这些股票赋予用户访问创作者内容的权利。FT的推出引发了广泛的关注&#xff0c;吸引了…...

yolov7中Concat之后加注意力模块(最复杂的情况)

1、common.py中找到Concat模块&#xff0c;复制一份 2、要传参进来&#xff0c;dim通道数 3、然后找yolo.py模块&#xff0c;添加 4、yaml里替换 5、和加的位置也有关系...

解除百度安全验证

使用chrome浏览器用百度浏览时&#xff0c;一直弹百度安全验证&#xff1a; 在设置里进行重置&#xff1a; 然后重启浏览器就可以了。...

Codeforces Round 731 (Div 3)(A - F)

Codeforces Round 731 (Div. 3)(A - F) Dashboard - Codeforces Round 731 (Div. 3) - Codeforces A. Shortest Path with Obstacle&#xff08;思维&#xff09; 思路&#xff1a;显然要计算 A → B 之间的曼哈顿距离 &#xff0c; 要绕开 F 当且仅当 AB形成的直线平行于坐…...

Python的sort()与sorted()函数详解

目录 sort&#xff08;&#xff09;函数 sorted&#xff08;&#xff09;函数 key参数 区别 sort&#xff08;&#xff09;函数 sort()方法&#xff1a;该方法用于原地对列表进行排序&#xff0c;即直接在原始列表上进行排序操作&#xff0c;并不返回一个新的列表。 my_l…...

用python实现基本数据结构【04/4】

说明 如果需要用到这些知识却没有掌握&#xff0c;则会让人感到沮丧&#xff0c;也可能导致面试被拒。无论是花几天时间“突击”&#xff0c;还是利用零碎的时间持续学习&#xff0c;在数据结构上下点功夫都是值得的。那么Python 中有哪些数据结构呢&#xff1f;列表、字典、集…...

“必抓!”算法

一个程序员一生中可能会邂逅各种各样的算法&#xff0c;但总有那么几种&#xff0c;是作为一个程序员一定会遇见且大概率需要掌握的算法。今天就来聊聊这些十分重要的“必抓&#xff01;”算法吧~ 你可以从以下几个方面进行创作&#xff08;仅供参考&#xff09; 一&#xff…...

【监控系统】Promethus整合Alertmanager监控告警邮件通知

【监控系统】Promethus整合Alertmanager监控告警邮件通知 Alertmanager是一种开源软件&#xff0c;用于管理和报警监视警报。它与Prometheus紧密集成&#xff0c;后者是一种流行的开源监视和警报系统。Alertmanager从多个源接收警报和通知&#xff0c;并根据一组配置规则来决定…...

【韩顺平】Linux基础

目录 1.网络连接三种方式 1.1 桥接模式&#xff1a;虚拟系统可以和外部系统通讯&#xff0c;但是容易造成IP冲突【1-225】 1.2 NAT模式&#xff1a;网络地址转换模式。虚拟系统可以和外部系统通讯&#xff0c;不造成IP冲突。 1.3 主机模式&#xff1a;独立的系统。 2.虚拟机…...

好奇一下各个大模型对华为mate60系列的看法

目前华为Mate60系列手机已上市并获抢购&#xff0c;个人觉得很不错&#xff0c;很好奇各个AI大模型对此事的看法&#xff0c;于是对chatGPT、文心一言、讯飞星火进行了一下粗浅的测试。 题目一&#xff08;看看三个模型的综合分析能力&#xff09; “目前华为Mate60系列手机已…...

UMA 2 - Unity Multipurpose Avatar☀️五.如何使用别人的Recipe和创建自己的服饰Recipe

文章目录 🟥 使用别人的Recipe1️⃣ 导入UMA资源效果展示2️⃣ 更新Library3️⃣ 试一下吧🟧 创建自己的服饰Recipe1️⃣ 创建自己的服饰Recipe2️⃣ 选择应用到的Base Recipe3️⃣ 指定显示名 / 佩戴位置 / 隐藏部位4️⃣ 给该服饰Recipe指定Slot / Overlay🚩 赋予Slot�…...

代码随想录训练营第五十六天| 583. 两个字符串的删除操作 、72. 编辑距离

583. 两个字符串的删除操作 题目链接/文章讲解/视频讲解&#xff1a;代码随想录 1.代码展示 //583.两个字符串的删除操作 int minDistance(string word1, string word2) {//step1 构建dp数组&#xff0c;dp[i][j]的含义是要使以i-1为结尾的word1和以j-1为结尾的word2//删除其元…...

UML 关系详解

依赖&#xff08;Dependency&#xff09;含义&#xff1a;一个类的变化会影响到另一个类&#xff0c;但反之不一定。这是一种“使用”关系&#xff0c;通常是临时的、较弱的。典型场景&#xff1a;一个类作为另一个类方法的局部变量、方法参数&#xff0c;或调用静态方法。UML表…...

1986-2025年上市公司高校专利知识溢出

高校专利知识溢出&#xff0c;是衡量企业所处省份外部知识环境与高校创新资源外溢程度的重要指标。对于企业尤其是技术密集型企业而言&#xff0c;其创新活动不仅依赖内部研发投入&#xff0c;也深受所在地区知识基础、科研资源和学术创新氛围的影响。高校作为基础研究和前沿技…...

Taotoken模型广场在项目技术选型阶段提供的便利性体验

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken模型广场在项目技术选型阶段提供的便利性体验 启动一个新的AI项目时&#xff0c;技术决策者面临的首要挑战往往是模型选型…...

【Mem0】 源码剖析(一):Agent 的记忆危机与 Mem0 的三阶段管道——为什么 RAG 不够用?

【Mem0】 源码剖析&#xff08;一&#xff09;&#xff1a;Agent 的记忆危机与 Mem0 的三阶段管道——为什么 RAG 不够用&#xff1f; 写在前面&#xff1a;54K Star&#xff0c;论文被 arXiv 收录&#xff0c;LOCOMO 基准 SOTA——Mem0 是当前 Agent 记忆层的事实标准。它的核…...

【最新版】heic格式转换器下载教程 livp格式转jpg超详细图文转换教程

文章目录准备工作安卓手机拍摄的heic格式转jpg教程苹果heic格式转jpg专用工具livp格式转jpg教程heic格式文件无法打开的原因及解决方法heic转换jpg后文件变大是什么原因本文将详细教你实现heic格式转jpg与livp格式转jpg的操作方法&#xff0c;同时免费提供实用的heic格式转换器…...

Next-Enterprise:基于Next.js的企业级应用启动模板全解析

1. 项目概述&#xff1a;为什么说 Next-Enterprise 是“企业级”的&#xff1f;如果你正在用 Next.js 开发一个中后台管理系统、一个 SaaS 应用&#xff0c;或者任何需要“开箱即用”的现代企业级功能的应用&#xff0c;那么你大概率经历过这样的场景&#xff1a;项目初始化后&…...

飞蜂窝技术:从概念到5G室内覆盖核心的实战演进

1. 从“未来可期”到“正在爆发”&#xff1a;飞蜂窝技术的十年之约在通信行业里待久了&#xff0c;你总会听到一些技术名词被反复提起&#xff0c;它们像流星一样划过天际&#xff0c;被分析师们预言将“改变一切”&#xff0c;然后……似乎又沉寂了下去。飞蜂窝&#xff08;F…...

别再复制粘贴了!手把手教你为51单片机LCD12864制作自定义中文字库(Keil C51环境)

从零构建51单片机LCD12864自定义中文字库的完整实战指南 在嵌入式显示领域&#xff0c;标准字库往往无法满足个性化需求。当我们需要在LCD12864屏幕上显示特殊符号、品牌LOGO或艺术字体时&#xff0c;自定义字库技术就成为关键突破点。本文将彻底解析从字模提取到ROM优化的全流…...

RootlessJamesDSP:无Root环境下的Android全局音频处理方案解析

1. 项目概述&#xff1a;在无根环境中驯服音频的“魔法师”如果你是一个对手机音质有追求的安卓用户&#xff0c;或者是一个喜欢折腾音频处理插件的玩家&#xff0c;那么你很可能听说过或者用过 JamesDSP。它是一款功能强大的音频处理引擎&#xff0c;能够通过复杂的算法&#…...

锌电池技术解析:长时储能的安全经济新选择

1. 储能技术演进与锌电池的崛起在能源转型的浪潮中&#xff0c;储能系统的角色已经从“锦上添花”变成了“不可或缺的基石”。我们从业者最直观的感受是&#xff0c;早期的储能项目大多围绕“削峰填谷”展开&#xff0c;目标相对单一。但随着可再生能源渗透率的急剧提升&#x…...