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

请添加图片描述

文章目录

  • 🚀前言
  • 🚀异或运算的基本用法
  • 🚀一组数中一种数出现了奇数次,其他种数出现了偶数次,找出这个数
  • 🚀一组数中有两种数出现了奇数次,其他种数出现了偶数次,求这两个数
    • ✈️得到一个数最右侧的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;
}

请添加图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

4D毫米波雷达——FFT-RadNet 目标检测与可行驶区域分割 CVPR2022

前言 本文介绍使用4D毫米波雷达&#xff0c;实现目标检测与可行驶区域分割&#xff0c;它是来自CVPR2022的。 会讲解论文整体思路、输入数据分析、模型框架、设计理念、损失函数等&#xff0c;还有结合代码进行分析。 论文地址&#xff1a;Raw High-Definition Radar for Mu…

[pytorch] 2. tensorboard

tensorboard简介 TensorBoard 是一组用于数据可视化的工具。它包含在流行的开源机器学习库 Tensorflow 中.但是也可以独立安装&#xff0c;服务Pytorch等其他的框架 可以常常用来观察训练过程中每一阶段如何输出的 安装pip install tensorboard启动tensorboard --logdir<d…

自定义注解与拦截器实现不规范sql拦截(自定义注解填充插件篇)

在自定义注解与拦截器实现不规范sql拦截&#xff08;拦截器实现篇&#xff09;中提到过&#xff0c;写了一个idea插件来辅助对Mapper接口中的方法添加自定义注解&#xff0c;这边记录一下插件的实现。 需求简介 在上一篇中&#xff0c;定义了一个自定义注解对需要经过where判…

理解PCIE设备透传

PCIE设备透传解决的是使虚拟机直接访问PCIE设备的技术&#xff0c;通常情况下&#xff0c;为了使虚拟机能够访问Hypervisor上的资源&#xff0c;QEMU&#xff0c;KVMTOOL等虚拟机工具提供了"trap and emulate"&#xff0c; Virtio半虚拟化等机制实现。但是这些实现都…

[学习笔记]刘知远团队大模型技术与交叉应用L4-Prompt-learning Delta-learning

Prompt-Learning and Delta-Tunning 背景和概览 但是从T5开始&#xff0c;大模型越来越大了。 微调很难了。 模型的趋势 Model Scaling&#xff1a;模型越来越大 Difficult Tuning&#xff1a;微调越来越难 Prompt-Learning 基本组成与流程介绍 预训练和fine-tuning有一…

数学建模学习笔记||层次分析法

评价类问题 解决评价类问题首先需要想到一下三个问题 我们评价的目标是什么我们为了达到这个目标有哪几种可行方案评价的准则或者说指标是什么 对于以上三个问题&#xff0c;我们可以根据题目中的背景材料&#xff0c;常识以及网上收集到的参考资料进行结合&#xff0c;从而筛…

反欺诈与异常点检测

1. 反欺诈检检测 1.1 反欺诈检测的难点 反诈骗实际是个多分类问题&#xff0c;每种不同的诈骗都当做一种单独的类型。除了欺诈手段多样且持续变化&#xff0c;欺诈检测一般还面临以下问题&#xff1a; 1. 大部分情况下数据是没有标签的&#xff0c;各种成熟的监督学习没有用武…

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

这里承接上篇文章反序列化字符串逃逸&#xff08;上篇&#xff09;-CSDN博客带大家学习反序列化字符串逃逸减少&#xff0c;没有看过的可以先去看看&#xff0c;不会吃亏。 例题&#xff1a; <?php highlight_file(__FILE__); error_reporting(0); function filter($name…

vectorCast基于分类树设计测试用例

根据代码的条件,以图表的形式为大家展示出各个变量组合的等价类划分。性别分为2类,年龄分为3类,工作年数分为3类。 那么它们最全面的组合结果就是2*3*3=18 也就是说它们最多有18种组合情况的测试用例 2.选中该函数,点击右键 3.自动生成一个map的基于分类树的测试用例 4.此…

commit 历史版本记录修正

commit 历史版本记录修正 当 Bug 发生的时候&#xff0c;我们会需要去追踪特定 bug 的历史记录&#xff0c;以查出该 bug 真正发生的原因&#xff0c;这个时候就是版本控制带来最大价值的时候。 因此&#xff0c;要怎样维持一个好的版本记录是非常重要的&#xff0c;下面是一…

机器学习--Matplotlib

机器学习–Matplotlib Matplotlib 是专门用于开发2D图表(包括3D图表)以渐进、交互式方式实现数据可视化 简单的Matplotlib画图 — 以折线图为例 matplotlib.pyplot模块 matplotlib.pytplot包含了一系列类似于matlab的画图函数。 import matplotlib.pyplot as plt图形绘制流…

7.【CPP】String类

一.汉字的编码 我们知道计算机存储英文字母&#xff0c;标点&#xff0c;数字用的是ascall码&#xff0c;128种用一个字节表示绰绰有余。而汉字远远不止128种&#xff0c;因此汉字需要两个字节表示。 1.gbk编码中汉字占两个字节。 2.utf-8中&#xff0c;一个汉字占三个字节。…

Java - 深入四大限流算法:原理、实现与应用

文章目录 Pre概述简单计数器原理实现测试优缺点 滑动窗口算法原理实现测试优缺点 漏桶算法原理实现测试优缺点 令牌桶算法原理实现测试优缺点 小结 Pre 深入理解分布式技术 - 限流 并发编程-25 高并发处理手段之消息队列思路 应用拆分思路 应用限流思路 SpringBoot - 优雅…

(上) C语言中的语句分类及分支语句:if语句、switch语句介绍

目录 前言 一、语句的分类 1. 空语句 2. 表达式语句 3. 函数调用语句 4. 复合语句 5. 控制语句 二、分支语句 1. if语句 (1) if的使用 (2) else的使用 (3) 分支中包含多条语句 (4) 嵌套if (5) 悬空else问题 2. switch语句 (1) if语句和switch语句的对比 (2) s…

摇臂MG995舵机模块实战教程

简介 舵机也叫伺服电机&#xff0c;最早用于船舶上实现其转向功能&#xff0c;由于可以通过程序连续控制其转角&#xff0c;因而被广泛应用智能小车以实现转向以及机器人各类关节运动中。舵机&#xff08;英文叫Servo&#xff09;&#xff1a;它由直流电机、减速齿轮组、传感器…

计算机网络——面试问题

1 从输⼊ URL 到⻚⾯展示到底发⽣了什么&#xff1f; 1. 先检查浏览器缓存⾥是否有缓存该资源&#xff0c;如果有直接返回&#xff1b;如果没有进⼊下⼀ 步⽹络请求。 2. ⽹络请求前&#xff0c;进⾏ DNS 解析 &#xff0c;以获取请求域名的 IP地址 。 3. 浏览器与服务器…

Sqoop与Kafka的集成:实时数据导入

将Sqoop与Kafka集成是实现实时数据导入和流处理的关键步骤之一。Sqoop用于将数据从关系型数据库导入到Hadoop生态系统中&#xff0c;而Kafka则用于数据流的传输和处理。本文将深入探讨如何使用Sqoop与Kafka集成&#xff0c;提供详细的步骤、示例代码和最佳实践&#xff0c;以确…

Git与GitHub零基础教学

大家好&#xff0c;我是星恒&#xff0c;这个帖子给大家分享的是git和github的全套教程&#xff0c;包含github初始&#xff0c;git常用命令以及基本使用&#xff0c;git的ssh链接github&#xff0c;github使用token登录&#xff0c;github和idea的配合&#xff0c;一些平时常用…

适合初学者的 机器学习 资料合集(可快速下载)

AI时代已经来临&#xff0c;机器学习成为了当今的热潮。但是&#xff0c;很多人在面对机器学习时却不知道如何开始学习。 今天&#xff0c;我为大家推荐几个适合初学者的机器学习开源项目&#xff0c;帮助大家更好地了解和掌握机器学习的知识。这些项目都是开源的&#xff0c;…

EtherNet/IP开发:C++开发CIP源代码

① 介绍一下CIP CIP是一种考虑到自动化行业而设计的通用协议。然而&#xff0c;由于其开放性&#xff0c;它可以并且已经应用于更多的领域。CIP网络库包含若干卷&#xff1a; 第1卷介绍了适用于所有网络自适应的CIP的常见方面。本卷包含通用对象库和设备配置文件库&#xff0…