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

请添加图片描述

文章目录

  • 🚀前言
  • 🚀异或运算的基本用法
  • 🚀一组数中一种数出现了奇数次,其他种数出现了偶数次,找出这个数
  • 🚀一组数中有两种数出现了奇数次,其他种数出现了偶数次,求这两个数
    • ✈️得到一个数最右侧的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);//拿到了这俩个数异或结果最末尾的1for (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.mzph.cn/news/638735.shtml

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

相关文章

Spring Boot3.2.2整合MyBatis Plus3.5.5

目录 1.前置条件 2.导坐标 3.配置数据源 4.配置mapper扫描路径 5.MyBatis Plus代码生成器整合 1.导坐标 2.编写代码生成逻辑 1.前置条件 已经初始化好一个spring boot项目且版本为3X&#xff0c;项目可正常启动 2.导坐标 <dependency><groupId>com.baomid…

弹性调度助力企业灵活应对业务变化,高效管理云上资源

作者&#xff1a;吴昆 什么是弹性调度 云计算时代&#xff0c;企业可以通过云平台获得大量计算资源&#xff0c;并根据业务发展和流量需求的实时变化&#xff0c;灵活调整使用的资源类型与资源量。阿里云提供了多种弹性资源&#xff0c;如云服务器 ECS 和弹性容器实例 ECI&am…

基于 Spring Boot+MySQL实现的在线考试系统源码+数据库,基于不同类型的客观题,进行自动组卷、批卷等功能的考试系统

1. 部署相关 1.1. 介绍 一个 JAVA 实现的在线考试系统,主要实现一套基于不同类型的客观题,进行自动组卷、批卷等功能的考试系统&#xff08;没有主观题&#xff09; 1.2. 系统架构 后端技术栈基于 Spring Boot数据库MySQLORMMyBatis & MyBatis-plus缓存Redis、guava的L…

【Java网络编程02】套接字编程

【Java网络编程02】套接字编程 1. Socket套接字 概念&#xff1a;Socket套接字&#xff0c;就是系统提供用于实现网络通信的技术&#xff0c;是基于TCP/IP协议的网络通信基本操作单元。基于Socket套接字的网络程序开发就是网络编程。 分类&#xff1a; 我们可以把Socket套接字…

docker 部署 sentinel

docker 部署 sentinel 环境安装 拉取镜像 目前稳定的版本是1.8.0 docker pull bladex/sentinel-dashboard:1.8.0启动服务 docker run --name sentinel -p 8858:8858 -td bladex/sentinel-dashboard:1.8.0登录 登录的时候账号和密码都是sentinel

算法训练营Day45

#Java #动态规划 Feeling and experiences&#xff1a; 最长公共子序列&#xff1a;力扣题目链接 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新…

泛型..

1.泛型 所谓泛型 其实就是一种类型参数(我们平常所见到的参数指的就是方法中的参数 他接收有外界传递来的值 然后在方法中进行使用) 并且还提高了代码的复用率 何以见得提高了代码的复用率 其实就是通过对比使用了泛型技术和没有使用泛型技术之间的区别&#xff1a; 以下是没有…

windows如何切换访问NAS共享文件夹用户

从资源管理器对NAS共享文件夹输入用户名与密码进行访问后&#xff0c;想切换访问用户&#xff0c;搜索了一圈&#xff0c;网上介绍的方法都无效&#xff0c;最后只能注销windows7登陆&#xff0c;然后重新登陆&#xff0c;再访问NAS共享时才能切换用户&#xff0c;各位观众如有…

深度学习记录--Momentum gradient descent

Momentum gradient descent 正常的梯度下降无法使用更大的学习率&#xff0c;因为学习率过大可能导致偏离函数范围&#xff0c;这种上下波动导致学习率无法得到提高&#xff0c;速度因此减慢(下图蓝色曲线) 为了减小波动&#xff0c;同时加快速率&#xff0c;可以使用momentum…

【软件测试】学习笔记-制定性能测试的目标

之前有同学交流过&#xff0c;在测试执行过程中他并不清楚测试得到的结果到底能不能满足这次活动的需求。经过追问&#xff0c;发现他连本次活动规则涉及的模块和接口都不是十分清楚&#xff0c;像这样的测试就是没有做性能测试目标的分析。虽然说做了性能测试&#xff0c;但几…

学习CANopen --- [12] Abort报文

当我们使用SDO进行读写操作时&#xff0c;有时device会返回abort报文&#xff0c;意味着本次SDO读写失败。本文使用例子来讲解Abort报文&#xff0c;以及如何解读失败原因。 一 Device例子 下面是device的python代码&#xff0c;文件名叫device.py&#xff0c;device的CANopen…

Linux配置主机名-使用主机名访问服务器

主要需要对Hosts文件进行操作&#xff0c; Hosts是一个没有扩展名的系统文件&#xff0c;可以用记事本等工具打开&#xff0c;其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”&#xff0c; 先将自己的主机名设置成有意义&#xff0c;别人好记的样子&a…

上位机图像处理和嵌入式模块部署(开篇)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 图像处理是现实生活当中很实用的一门技术。工业上一般采用的是机器视觉&#xff0c;以传统算法和光源控制为主&#xff0c;部分采用了深度学习技术…

【51单片机】外部中断

0、前言 参考&#xff1a;普中 51 单片机开发攻略 第16章 及17章 1、硬件 2、软件 #include <reg52.h> #include <intrins.h> #include "delayms.h"typedef unsigned char u8; typedef unsigned int u16;sbit led P2^0; sbit key3 P3^2;//外部中断…

【深度学习:数据增强 】提高标记数据质量的 5 种方法

【深度学习&#xff1a;数据增强 】提高标记数据质量的 5 种方法 计算机视觉中常见的数据错误和质量问题&#xff1f;为什么需要提高数据集的质量&#xff1f;提高标记数据质量的五种方法使用复杂的本体结构作为标签人工智能辅助标签识别标签错误的数据改进注释者管理 计算机视…

spark 入门教程

一、安装scala环境 官网下载地址 Download | The Scala Programming Language,本次使用版本为sacla2.11.12,将压缩包解压至指定目录&#xff0c;配置好环境变量&#xff0c;控制台验证是否安环境是否可用&#xff1a; 二、添加pom依赖 创建一个maven项目 1、添加scala的sdk依…

github 推送报错 ssh: connect to host github.com port 22: Connection timed out 解决

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall &#x1f343; vue3-element-admin &#x1f343; youlai-boot &#x1f33a; 仓库主页&#xff1a; Gitee &#x1f4ab; Github &#x1f4ab; GitCode &#x1f496; 欢迎点赞…

[pytorch] 2. tensorboard

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

会声会影2024专业旗舰版新功能介绍

随着科技的不断发展&#xff0c;视频制作已经不再是专业人士的专属领域&#xff0c;越来越多的人开始使用各种视频制作软件来记录生活、创作内容。其中&#xff0c;会声会影是被广泛使用的一款视频制作软件&#xff0c;其旗舰版更是备受关注。 据悉&#xff0c;会声会影2024旗舰…

E/E架构升级是汽车智能化发展关键

E/E架构升级是汽车智能化发展的关键。传统汽车采用的分布式E/E架构因计算能力不足、通讯带宽不足、不便于软件升级等瓶颈&#xff0c;无法满足现阶段汽车发展的需求&#xff0c;E/E架构升级将助力智能汽车实现跨越式革新。汽车E/E架构升级主要体现在硬件架构升级、软件架构升级…