位运算相关算法
一、异或运算介绍
1、性质介绍
异或运算(XOR,Exclusive OR)是一种位运算符。对于两个位进行异或操作,当且仅当这两个位不同时,结果为 1;如果相同,则结果为 0。
| A | B | A^B |
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
- 任何数与自身异或结果为 0。
- 任何数与 0 异或结果为自身。
- 交换性: a^b=b^a。
- 结合性: (a^b)^c=a^(b^c)。
2、结论
由于上面我们提到了异或运算是满足交换律和结合律的,所以异或运算就有以下特性:
对于 a, b, c 三个变量相异或,无论异或的顺序是什么,结果都是相同的。
a ^ b ^ c = a ^ c ^ b = b ^ c ^ a = b ^ a ^ c = c ^ a ^ b = c ^ b ^ a
二、位运算的应用
1、不用中间变量交换两个数的值
1)介绍
int a = 3;int b = 5;System.out.println("Before swap:\n" + "a = " + a + "\nb = " + b);a = a ^ b;b = a ^ b;a = a ^ b;System.out.println("After swap:\n" + "a = " + a + "\nb = " + b);
运行结果:

2)具体原理图解

3)补充
这样交换只能交换两个不同位置的变量,如果对同一个变量交换,会把这个变量的值变成 0。
所以需要添加一个条件,如果是同一个元素,就不进行交换。
public static void swap(int[] arr, int i , int j) {if(arr[i] != arr[j]) {arr[i] = arr[i] ^ arr[j];arr[j] = arr[i] ^ arr[j];arr[i] = arr[i] ^ arr[j];}}
2、找出只出现一次的元素
1)介绍
在一个数组中,其他元素都出现偶数次,只有一个元素出现奇数次,可以用异或找出它。
public static int findOddTimes(int[] arr) {int ans = 0;for(int i : arr) {ans ^= i;}return ans;}
运行结果:

2)原理图解

3、提取二进制最低有效位的1(最右侧的1)
1)介绍

在之前的文章《Java——二进制原码、反码和补码_原码反码补码-CSDN博客》中有提到过,求一个数的相反数可以使用取反加一的方法,对于变量 a,其相反数为 -a,-a = ~a + 1。
2)详细原理图解

4、求出两个出现奇数次的数
1)介绍
输入数据为一个数组,数组中有两个不同的数 a 和 b 分别出现了奇数次,其他的数都是出现了偶数次。求出这两个不同的数。
首先我们先将数组中的所有数异或起来,然后这时的结果就是这两个不同的数的异或,也就是 a ^ b 的结果。由于这两个数是不同的,所以结果一定不为零,也就是说 a ^ b != 0。所以说这个结果的二进制中一定有某一位是 1,我们就可以通过上面给出的提取最右边的 1 的方法,将最右边的 1 提取出来。然后通过这个 1,我们就可以分辨 a 和 b,因为结果的这一位为 1,所以 a 和 b 的这一位必然不同。
然后我们再将这一数组的所有数分组异或起来,使用上面提取出的最右位置的 1 来分组,这样就可以将 a 和 b 分在不同组中,对于其他数,相同的数一定分在同一组,异或的结果就是 0,所以其他的数是没有什么影响的。
简化一下就是以下步骤:
-
异或运算:先对数组中所有数字进行异或,结果就是目标的两个数的异或值。
-
区分两数:找到异或结果中任意为1的位置,用于区分这两个数。这可以通过
xor & (-xor)来实现,提取出最低有效位的 1。 -
分组异或:根据该位是否为1,将数组分成两组,然后分别对两组进行异或,这样每组会得到一个目标数。
2)代码
public static void findTwoOddTimesNums(int[] arr) {int xor = 0;for (int i : arr) {xor ^= i;}int diff = xor & (-xor);int a = 0;int b = 0;for (int i : arr) {if ((i & diff) == 0) {a ^= i;} else {b ^= i;}}System.out.println("Two nums: " + a + ", " + b);}
运行结果:

上面的代码也可以改成下面这样:
public static void findTwoOddTimesNums(int[] arr) {int xor = 0;for (int i : arr) {xor ^= i;}int diff = xor & (-xor);int a = 0;for(int i : arr) {if((i & diff) != 0) {a ^= i;}}System.out.println("Two nums: " + a + ", " + (xor ^ a));//这里求出了其中一个数a,由于xor是a ^ b,所以xor ^ a就得到了b}
得到的结果是类似的:

5、找到出现K次的数
1)介绍
输入一个数组,数组中有一个数是出现了K次,其他数都出现了M次,M>1,K<M,找到这个出现了K次的数。
我们可以使用一个数组bitCount统计所有数字在每个位上1的出现次数。
然后就是遍历bitCount数组,如果某一位的计数不是M倍数,就可以证明出现K次的数的这一位一定为1,反之,某一位的计数是M的倍数,则出现K次的数的这一位是0。(能够这样判断的前提是题目中的限制条件,也就是M>1,M>K,而且出现K次的数只有一个,所以说最终某位计数可能是K + M*n,也可能是M*n,由于K<M,显然K + M*n不是M的倍数,而M*n是M的倍数)
然后就可以将出现K次的数的是1的位组合起来,最终得到结果。
-
位计数:使用一个大小为32的数组
bitCount来统计数组中所有数字在每个位上1的出现次数。对于每个数字,遍历其32位中的每一位,更新bitCount数组。 -
寻找结果:遍历
bitCount数组,如果某一位的计数不是M的倍数,那么这位一定属于那个出现K次的数。 -
重建结果:将这些位组合起来得到目标数字。
2)代码
public static int findTimesNum(int[] arr, int K, int M) {int[] bitCount = new int[32];for(int i : arr) {for(int j = 0; j < 32; j++) {if((i & (1 << j)) != 0) {bitCount[j]++;}}}int result = 0;for(int i = 0; i < 32; i++) {if(bitCount[i] % M != 0) {// 不能被M整除,则有出现K次的数在这一位为1result |= (1 << i);// 将最终结果的这一位置为1}}return result;}
运行结果:

相关文章:
位运算相关算法
一、异或运算介绍 1、性质介绍 异或运算(XOR,Exclusive OR)是一种位运算符。对于两个位进行异或操作,当且仅当这两个位不同时,结果为 1;如果相同,则结果为 0。 A B A^B00001 1 101110 任何数…...
解决:无法在此设备上激活Windows因为无法连接到你的组织的激活服务器
问题: 桌面右下角会出现这个东西👇 在设置里查看激活状态就会看到👇 解决方法 : 1.打开CMD 搜索CMD,然后以管理员身份运行 2.设置 KMS服务器 1)命令行输入: slmgr /skms kms.03k.org 然后…...
【Spring】——SpringBoot项目创建
阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 引入 一:介绍 二:Spring Boot项目创建 0:项目目录 1:…...
聊一聊:ChatGPT搜索引擎会取代谷歌和百度吗?
当地时间 10 月 31 日,OpenAI 正式推出了 ChatGPT 搜索功能,能实时、快速获取附带相关网页来源链接的答案。这一重大升级标志着其正式向谷歌的搜索引擎霸主地位发起挑战。 本周五我们聊一聊: 欢迎在评论区畅所欲言,分享你的观点~ …...
分布式中常见的问题及其解决办法
分布式中常见的问题及其解决办法 一、多个微服务要操作同一个存储在redis中的变量,如何确保这个变量的正确性 答: 在多个微服务操作同一个存储在Redis中的变量时,可以采取以下措施来确保变量的正确性: 1、使用Redis的事务&…...
HTML 基础标签——多媒体标签<img>、<object> 与 <embed>
文章目录 1. `<img>` 标签主要属性示例注意事项2. `<object>` 标签概述主要属性示例注意事项3. `<embed>` 标签概述主要属性示例注意事项小结在现代网页设计中,多媒体内容的使用变得越来越重要,因为它能够有效增强用户体验、吸引注意力并传达信息。HTML 提…...
word mathml 创建粗体字母快捷键
在 mathml 中达到latex中 \mathbf{A} 的效果 由于word本身不支持这个命令,所以打算用快捷键实现 快捷键的功能是加粗光标前一个字目 1. Alt F8 打开宏,如果打不开可以尝试 Alt Fn F8 2. 输入 BoldPreviousCharacter 新建宏: Sub Bold…...
ROOT添加用户提示权限不够
有个系统已经上线过了,之后测评整改要求不能用root启动中间件,我就想着添加一个普通用户,赋予指定目录权限,然后启动应用就行了 。 结果用root用户创建账号提示权限不够,确认了几遍,是root 命令前面加sud…...
关于使用svgIcon 菜单折叠 显示文字情况
使用的工具:vue2,ant design vue 问题: **解决:在<svg-icon> 外面包一层 <a-icon> ** 使用: 在 main.js 中:...
Python使用PDF相关组件案例详解
主要对pdfminer.six、pdfplumber、PyMuPDF、PyPDF2、PyPDF4、pdf2image、camelot-py七个PDF相关组件分别详解,具体使用案例演示 1. pdfminer.six pdfminer.six 是一个专门用来从 PDF 中提取文本的库,能够处理复杂的文本布局,适合用于文本解析…...
day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)
并查集理论基础 基础内容 并查集常用来解决连通性问题,主要有两个功能: 将两个元素添加到一个集合中判断两个元素在不在同一个集合 将三个元素A,B,C (分别是数字)放在同一个集合,其实就是将…...
鸿蒙next选择 Flutter 开发跨平台应用的原因
在移动操作系统的竞争中,鸿蒙(HarmonyOS)自从发布以来便吸引了广泛的关注。作为华为主导的操作系统,鸿蒙的设计初衷是打破平台壁垒,实现设备间的无缝连接与应用共享。然而,要实现这一目标,仅仅依…...
shodan6-7---清风
shodan6-7 1.shodan网页版 以cve-2019-0708漏洞指纹特征为例 "\x03\x00\x00\x0b\x06\xd0\x00\x00\x124\x00"在这里插入图片描述 搜索命令参考 https://www.shodan.io/search/filters这个网页中有搜索关键词 对指定网址进行监控,这里可以对ip进行扫描&…...
FTP、ISCSI、CHRONY、DNS、NFS、DOCKER、MARIADB、NGINX、PHP、CA各服务开启方法
2.1 FTP 服务 (vsftpd) 安装 vsftpd: sudo yum install vsftpd -y 启动并设置开机自启: sudo systemctl start vsftpdsudo systemctl enable vsftpd 配置文件位于 /etc/vsftpd/vsftpd.conf,可根据需要修改配置。 2.2 SCSI 服务 SCSI 配…...
抢先体验AI领域的新宠儿:Llama3.1,部署实战探索!
本文简介 就在今天,Meta 发布了 Llama 3.1,这次带来的中杯、大杯和超大杯3个版本。 从纸面数据来看,Llama 3.1 超大杯已经能跟 GPT-4 Omni、Claude 3.5 Sonnet 分庭抗礼了。 而中杯和大杯更是将同量级的对手摁在地上摩擦。 要知道ÿ…...
HarmonyOS基础:鸿蒙系统组件导航Navigation
大家好!我是黑臂麒麟(起名原因:一个出生全右臂自带纹身的高质量程序员😏),也是一位6(约2个半坤年)的前端; 学习如像练武功一样,理论和实践要相结合࿰…...
【K8S问题系列】Kubernetes 中 Pod 无法通过 Service 名称访问服务的 DNS 解析失败【已解决】
在 Kubernetes 中,Service 提供了一种稳定的方式,通过名称访问一组 Pod。当其他 Pod 无法通过 Service 名称访问服务,并且出现 DNS 解析失败时,通常会导致应用无法正常工作。本文将详细分析此问题的常见原因及其解决方案。 一、问…...
【下载工具】Internet Download Manager下载器介绍
Internet Download Manager(简称IDM)作为一款功能强大的下载管理软件,以其高效、稳定的特点受到了广大用户的青睐。本文将为您详细介绍IDM的功能特性以及具体的使用方法。 功能特性 加速下载:IDM通过多线程下载技术,…...
如何打开/关闭 GitLab 的版本检查功能?
本文分享如何打开/关闭 GitLab 的版本检查功能。 极狐GitLab 是 GitLab 的中国发行版【https://dl.gitlab.cn/ncecn6kb】,中文版本对中国用户更友好,文章以私有化部署的极狐GitLab 实例来演示版本检查功能的开启和关闭。强烈不建议关闭该功能࿰…...
java-web-day13-事务管理+spring aop
事务管理: 事务回滚 默认情况下,只有出现runtimeException(运行时异常)才回滚, 而如果出现其他异常,例如受检异常, 就不会回滚事务, 不过可以加上rollbackfor属性用于控制出现何种异常类型, 回滚事务 事务传播: 当一个事务方法被另一个事务方法调用时, 这个事务方法应该如何进行…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...
基于谷歌ADK的 智能产品推荐系统(2): 模块功能详解
在我的上一篇博客:基于谷歌ADK的 智能产品推荐系统(1): 功能简介-CSDN博客 中我们介绍了个性化购物 Agent 项目,该项目展示了一个强大的框架,旨在模拟和实现在线购物环境中的智能导购。它不仅仅是一个简单的聊天机器人,更是一个集…...
AT模式下的全局锁冲突如何解决?
一、全局锁冲突解决方案 1. 业务层重试机制(推荐方案) Service public class OrderService {GlobalTransactionalRetryable(maxAttempts 3, backoff Backoff(delay 100))public void createOrder(OrderDTO order) {// 库存扣减(自动加全…...
