位运算相关算法
一、异或运算介绍
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属性用于控制出现何种异常类型, 回滚事务 事务传播: 当一个事务方法被另一个事务方法调用时, 这个事务方法应该如何进行…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
通过Wrangler CLI在worker中创建数据库和表
官方使用文档:Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后,会在本地和远程创建数据库: npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库: 现在,您的Cloudfla…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
