异或运算的骚操作,由浅入深拿捏一类型的题

news2025/1/11 16:47:13

请添加图片描述

文章目录

  • 🚀前言
  • 🚀异或运算的基本用法
  • 🚀一组数中一种数出现了奇数次,其他种数出现了偶数次,找出这个数
  • 🚀一组数中有两种数出现了奇数次,其他种数出现了偶数次,求这两个数
    • ✈️得到一个数最右侧的1
  • 🚀究极进阶题

🚀前言

大家好啊!这里是阿辉又整的关于位运算的干货,不得不说异或运算真的6,话不多说来开始今天的学习吧!!!

🚀异或运算的基本用法

大家都知道异或运算是针对二进制位的运算两个数异或运算是将两个数的对应二进制位进行比较,若这两个数的对应的二进制位相等则取0,不相等则取1(其实也是对应位相加的结果进位舍去,所以异或运算也叫做无进位相加)
请添加图片描述
相信各位都见过利用异或运算进行两个数的交换的骚操作,其实这个交换利用了三条异或运算的性质:

  • a ^ a = 0相同的数字异或的结果是0
  • 0 ^ a = a0和其他数字异或的结果仍为该数字
  • 异或运算满足交换律和结合律
//无需临时变量交换两个变量
int a = 5, b = 6;
a = a ^ b;
b = a ^ b;//此时a的值为a ^ b ,所以b = a ^ b ^ b = a
a = a ^ b;//此时b的值为a,a的值还是a ^ b ,所以a = a ^ b ^ a = b,完成交换

下面介绍关于异或运算的相关题目,由浅入深,阿辉这波属实是干货满满❤️

🚀一组数中一种数出现了奇数次,其他种数出现了偶数次,找出这个数

阿辉直接上代码:

//一组数中一种数出现了奇数次,其他种数出现了偶数次,找出这个数

int oddnum(int a[], int len) {
	int ans = 0;
	for (int i = 0; i < len; i++) {
		ans ^= a[i];//偶数次的数异或结果为0,最后ans中留下的就是奇数次的数
	}
	return ans;
}

阿辉这里稍微解释一下,上面异或运算的基本使用不是介绍了异或运算的三个性质吗,利用这三个性质,我们将数组中所有的数全部异或,偶数次的数因为是偶数所以异或结果是0,而奇数次的数自然就留下来了

🚀一组数中有两种数出现了奇数次,其他种数出现了偶数次,求这两个数

这道题相当于上面一道题的变式,其实这道题阿辉当时并没有想出来,也是看了题解才会的
话不多说,这阿辉先上代码:

array<int, 2> townum(int a[], int len) {
	array<int, 2> ans = {};//作为返回值
	int one = 0;//记录其中一个数
	int another = 0;//记录另一个数
	int eor = 0;
	for (int i = 0; i < len; i++) {
		eor ^= a[i];//记录这两种数的异或结果
	}
	int endone = eor & (~eor + 1);//拿到了这俩个数异或结果最末尾的1
	for (int i = 0; i < len; i++) {//根据这个1,对原数组分组
		if ((a[i] & endone) != 0)
			one ^= a[i];//得到其中一个数
	}
	another = eor ^ one;//得到另一个数
	//下面这两步操作相当于把俩个数加进答案数组作为返回值返回
	ans.fill(one);
	ans.fill(another);
	return ans;
}

虽然这是cpp的代码但是C语言的铁子完全可以看得懂,对于array<int,2>你就把它当作一种类型就行了,相当于长度为2的int类型的数组,返回值也是这个

代码解读

比如对于这样一个数组:1 1 1 1 2 2 3 4 4 4 4 5 6 6 6 6
他们所有进行异或,最后的结果一定是3 ^ 5,因为只有3和5是出现奇数次
3异或5的值的二进制形式一定还有一个1,因为他俩不想等,所以异或结果一定有1(二进制形式下)这个1是怎么来的呢?这一位上有1只能说明3和5在这一位上不相等,一个是1一个是0,其实对于3异或5的结果的二进制形式下的任何一个1都能将3和5区分开(这里不懂为什么的接着看)这里我们为了方便就取最低位的1(也就是最右侧的1)
怎么取到最右侧的1呢?将这个数与上它的相反数即可(为什么讲完这题阿辉会详细解释)
然后根据这个1可以将原来的数组划分成两部分,一部分中只含有一个出现奇数次的数,然后对任意一部分的数全体异或即可得到其中一个出现奇数次的数,然后再将一开始原数组整体异或的结果和得到的一个数异或即可得到另一个数(并没有非常详细,但是各位阿辉基本上已经讲完了,一点细节各位可以自行揣摩,真不懂可以私信阿辉)

✈️得到一个数最右侧的1

对于一个数6,6的二进制是0110(这里阿辉用四位表示,各位应该看得懂),对~6就会得到1001如果这时我们给它加上1就会得到1010这时6 | (~6 + 1)就把最右侧的1取出来了(最右侧的1指的是0010这个数),为什么呢?
其实,我们要的是最右边的1,当你对原数字进行取反操作时,假如最右侧的1后面还有0,取反后加1就会让~a + 1a的最右侧1对应的位置上有一个1,他俩与运算完就会得到最右侧的1
请添加图片描述

🚀究极进阶题

题目:一组数,一种数出现了k次,其他的数出现了m次,m > 1, m > k,求出现k次的这种数
思路:
利用一个长度为32的num数组,遍历原数组中每一个数将原数组的每一个数的二进制位的每一位累加到num
然后num中每一个下标上对应的数字只要不是m的整数倍,就说明该二进制位上有1,遍历num数组即可得到出现k次的数
说实话这题真的骚

int onlyone(int a[], int len,int k, int m) {
	int ans = 0;
	int num[32] = { 0 };
	for (int j = 0; j < len; j++) {
		for (int i = 0; i < 32; i++) {
			num[i] += (a[i] >> i) & 1;//存数组中所有数字每一个二进制位的和
		}
	}
	for (int i = 0; i < len; i++) {//把模上m不等于0的位得到
		if (num[i] % m != 0)
			ans |= (1 << i);//将这每一位或到ans中,得到答案
	}
	return ans;
}

请添加图片描述

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

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

相关文章

反序列化字符串逃逸(上篇)

首先&#xff0c;必须先明白&#xff0c;这个点并不难&#xff0c;我给大家梳理一遍就会明白。 反序列化字符串逃逸就是序列化过程中逃逸出来字符&#xff0c;是不是很简单&#xff0c;哈哈哈&#xff01; 好了&#xff0c;不闹了&#xff0c;其实&#xff1a; 这里你们只要懂…

C++面试:跳表

目录 跳表介绍 跳表的特点&#xff1a; 跳表的应用场景&#xff1a; C 代码示例&#xff1a; 跳表的特性 跳表示例 总结 跳表&#xff08;Skip List&#xff09;是一种支持快速搜索、插入和删除的数据结构&#xff0c;具有相对简单的实现和较高的查询性能。下面是跳表…

Django 图片上传与下载

写在前面 在Web开发中&#xff0c;文件上传和下载是常见的功能之一。 Django 是一位魔法师&#x1fa84;&#xff0c;为我们提供了 FileField 和 ImageField 等神奇得字段类型&#xff0c;以及相应的视图和模板标签&#xff0c;使得处理文件变得十分便捷。本文以图片上传作为…

HTML CSS 发光字头特效

效果展示&#xff1a; 代码&#xff1a; <html><head> </head><style>*{margin: 0;padding: 0;}body {text-align: center;}h1{/* border: 3px solid rgb(201, 201, 201); */margin-bottom: 20px;}.hcqFont {position: relative;letter-spacing: 0.07…

深度解析Python关键字:掌握核心语法的基石(新版本35+4)

目录 关键字 keyword 关键字列表 kwlist softkwlist 关键字分类 数据类型 True、False None 运算类型 and、or、not in is 模块导入 import 辅助关键字 from、as 上下文管理 with 占位语句 pass 流程控制 if、elif、else for while break、continue…

【C语言】动态内存函数介绍

目录 1.malloc和free 2.calloc 3.realloc 1.malloc和free C语言提供了一个动态内存开辟的函数malloc&#xff1a; void* malloc(size_t size); 这个函数向内存申请一块连续可用的空间&#xff0c;并返回指向这块空间的指针。 ✔如果开辟成功&#xff0c;则返回一个指向开…

数据分析实战:城市房价分析

流程图&#xff1a; 1.读数据表 首先&#xff0c;读取数据集。 CRIMZNINDUSCHASNOXRMAGEDISRADTAXPTRATIOBLSTATtarget0.00632182.3100.5386.57565.24.09129615.3396.94.98240.0273107.0700.4696.42178.94.9671224217.8396.99.1421.60.0272907.0700.4697.18561.14.9671224217…

Python-import hook机制原理与使用

背景 钩子函数&#xff08;hook function&#xff09;&#xff0c;可以理解是一个挂钩&#xff0c;作用是有需要的时候挂一个东西上去。具体的解释是&#xff1a;钩子函数是把我们自己实现的hook函数在某一时刻挂接到目标挂载点上。 在 Python 众多特性中&#xff0c;有一个特…

【设计模式】代理模式的实现方式与使用场景

1. 概述 代理模式是一种结构型设计模式&#xff0c;它通过创建一个代理对象来控制对另一个对象的访问&#xff0c;代理对象在客户端和目标对象之间充当了中介的角色&#xff0c;客户端不再直接访问目标对象&#xff0c;而是通过代理对象间接访问目标对象。 那在中间加一层代理…

大模型学习与实践笔记(十一)

一、使用OpenCompass 对模型进行测评 1.环境安装&#xff1a; git clone https://github.com/open-compass/opencompass cd opencompass pip install -e . 当github超时无法访问时&#xff0c;可以在原命令基础上加上地址&#xff1a; https://mirror.ghproxy.com git clon…

UG制图-创建图纸的多种方法

1、2D&#xff1a;创建独立2D图纸&#xff0c;不引用任何3D模型 在UG软件中选择新建&#xff0c;或者快捷键ctrl N&#xff0c;进入新建命令&#xff0c;然后点击图纸&#xff0c;在关系中选择独立的部件&#xff0c;就创建了一个独立的图纸&#xff0c;我们可以在装配中添加…

java eazyexcel 实现excel的动态多级联动下拉列表(1)使用名称管理器+INDIRECT函数

原理 将数据源放到一个新建的隐藏的sheet中将选项的子选项的对应字典设置到名称管理器中&#xff08;名称是当前选项的内容&#xff0c;值是他对应的子菜单的单元格范围&#xff0c;在1里面的sheet中&#xff09;子菜单的数据根据INDIRECT函数去左边那个单元格获取内容&#x…

KMP 算法详解(C++ Version)

KMP 算法详解&#xff08;C Version&#xff09; 简述字符串匹配问题Brute-Force 算法Brute-Force 算法的改进思路跳过不可能成功的字符串比较next 数组利用 next 数组进行匹配快速求 next 数组 简述 KMP 算法是一种字符串匹配算法&#xff0c;可以在 O(nm) 的时间复杂度内实现…

ZYNQ程序固化

文章目录 一、简介二、固化操作2.1 生成固化文件2.2 固化到SD卡2.3 固化到Flash 参考 将程序存储在非易失性存储器中&#xff0c;在上电或者复位时让程序自动加载运行。 这个过程需要启动引导程序( Boot Loader)参与&#xff0c;Boot Loader会加载FPGA配置文件&#xff0c;以及…

读元宇宙改变一切笔记12_元宇宙+

1. 元宇宙的价值 1.1. 元宇宙的价值&#xff0c;将“超过”物理世界 1.2. 移动互联网时代不是突然降临的 1.2.1. 我们可以确定一项特定的技术是何时被创造、测试或部署的&#xff0c;但不能确定一个时代何时开始或何时结束 1.2.2. 转型是一个迭代的过程&#xff0c;在这个过…

web架构师编辑器内容-完成属性设置的优化

对于业务组件来说&#xff0c;其属性是有很多的&#xff0c;如果把所有属性都平铺在页面上&#xff0c;就会非常长&#xff0c;而且想要更改其中的某些属性&#xff0c;可能需要向下滚动很久才能找到&#xff0c;对于UI的交互不是很友好&#xff0c;需要对属性的不同特性进行分…

彩色图像处理之彩色图像直方图处理的python实现——数字图像处理

彩色图像的直方图处理是一种重要的图像处理技术&#xff0c;用于改善图像的视觉效果&#xff0c;增强图像的对比度&#xff0c;或为后续的图像处理任务&#xff08;如图像分割、特征提取&#xff09;做准备。彩色图像通常由红色&#xff08;R&#xff09;、绿色&#xff08;G&a…

2023年12月 Scratch 图形化(一级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch图形化等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 观察下列每个圆形中的四个数,找出规律,在括号里填上适当的数?( ) A:9 B:17 C:21 D:5 答案:C 左上角的数=下面两个数的和+右上角的数

【UEFI基础】EDK网络框架(UDP4)

UDP4 UDP4协议说明 UDP的全称是User Datagram Protocol&#xff0c;它不提供复杂的控制机制&#xff0c;仅利用IP提供面向无连接的通信服务。它将上层应用程序发来的数据在收到的那一刻&#xff0c;立即按照原样发送到网络。 UDP报文格式&#xff1a; 各个参数说明如下&…

Tomcat Notes: Web Security

This is a personal study notes of Apache Tomcat. Below are main reference material. - YouTube Apache Tomcat Full Tutorial&#xff0c;owed by Alpha Brains Courses. https://www.youtube.com/watch?vrElJIPRw5iM&t801s 1、Overview2、Two Levels Of Web Securi…