首页 > 编程语言 >异或运算在算法中的神奇应用

异或运算在算法中的神奇应用

时间:2024-04-06 18:45:16浏览次数:21  
标签:0110 运算 二进制 算法 0100 eor 异或

1. 什么是异或

两个二进制数进行异或运算时,每一位上的数相同则结果为0,不同则结果为1。

示例:6^7=?

转化成二进制:
6=110
7=111
6^7=110^111=001=1

简单记:异或就是二进制的无进位相加。
还有个同或运算:相同为1,不同为0,和异或是反的。

2. 异或运算的特性

  1. 任何数与0异或,结果还是这个数:0^n=n
  2. 任何数与自身异或,结果都是0:n^n=0
  3. 异或运算满足交换律和结合律

这几个特性按照无进位相加的思路来理解,就很好想明白。

3. 异或运算的神奇应用

3.1 两数交换

两个数经过3次异或运算后,可以交换位置。这其实也是上面特性的一个应用。

a=1; b=3;
a=a^b; // a与b异或后,赋值给a:a=1^3 b=3
b=a^b; // 赋值后的a与b再次异或后,赋值给b:a=1^3 b=1^3^3=1(此时a初始的值已经赋给b了)
a=a^b; // 赋值后的a和b再次异或后,赋值给a:a=1^3^1=3 b=1(完成了交换)

以上交换的逻辑,只有在两个数指向不同的内存块时,才有效。如果两个数,指向同一个内存块,实际上就是1个数,此时异或后,会得到0。
算法题:https://leetcode.cn/problems/swap-numbers-lcci/description/

3.2 找到出现奇数次的那个数

有一组数,只有一个数出现了奇数次,其他数都出现了偶数次,如何快速找到这个数?

只要将所有数都做异或运算,得到的结果就是那个数。这是 n^n=0 & 0^n=n 的一个应用。

算法题:https://leetcode.cn/problems/single-number/description/

3.3 提取二进制数最右侧的1(与异或无关)

给定一个二进制的数,找到最右侧的1。例如,二进制数:11001000,最右侧的1对应的二进制数为:00001000。

通过公式:n & (~n + 1) 即可得到结果。

以 11001000 为例:
00110111 // 对n取反:~n
00111000 // 取反后加1:~n + 1
00001000 // 和n进行与运算:n & (~n + 1)

取反运算规则:将二进制的每一位逆转,1变成0,0变成1
与运算规则:仅1&1=1,其他都为0。

应用:找出一个二进制数n中一共有多少个1

rightOne = n & (~n + 1) // 找出最右侧的1
n ^= rightOne // n和rightOne异或后,再赋值给n,可以抹掉n最右侧的1
循环以上两步直到n=0,数出一共循环了多少次即可

算法题:https://leetcode.cn/problems/number-of-1-bits/description/

扩展:通过公式 n & (n - 1) 可以抹掉最右侧的1,也可以找出二进制数中有多少个1。

以 11001000 为例:
11000111 // n - 1
11000000 // n & (n - 1)

3.4 找到出现奇数次的那2个数

有一组数,大部分数都出现了偶数次,只有2个不同的数出现了奇数次,如何快速找到这2个数?

思路:
假设这两个数为a和b,将所有的数进行异或运算,得到的结果一定是:eor=a^b
eor一定不等于0(因为a!=b),也就是说eor的二进制数在某一位上一定是1,且这个1一定来源于a和b其中一个数(因为只有1^0=1)
假设eor在第8位是1,根据第8位是1将数组分成两组,1组中数的第8位都是1,2组中数的第8位都是0,如果a在1组中,那么b一定在2组中
上面两组数中,除了a和b以外,其他数一定出现偶数次。1组所有数全部异或一定等于a,同理2组异或等于b
那么,只要得到eor最右侧的1对应的数eor',再用eor'与最初的数组的每一个数进行与运算,结果等于1(或等于1)的全部保留下来进行异或运算,一定得到了a或b
再用eor异或上面的结果,就得到了另一个数,这样两个数都找到了。

以 [4, 4, 5, 5, 6, 7] 为例(对应的二进制数:[0100, 0100, 0101, 0101, 0110, 0111]):
eor= 4^4 ^ 5^5 ^ 6^7 = 6^7 = 0110^0111 = 0001 // 将所有的数异或
eor'= 0001 // 找到eor最右侧的1对应的数(通过第3.3小节的公式可以得到)
array1= [0100, 0100, 0110] // 分成2组数,这一组和eor'进行与运算后都等于0,其他的数和eor'进行与运算后都不等于0
a= 0100 & 0100 & 0110 = 0110 = 6
b= a^eor = 0110 ^ 0001 = 0111 = 7

算法题:https://leetcode.cn/problems/single-number-iii/description/

标签:0110,运算,二进制,算法,0100,eor,异或
From: https://www.cnblogs.com/wind-wound/p/18117730

相关文章

  • MySQL中的逻辑运算符,位运算符
    转自:https://blog.csdn.net/Sihang_Xie/article/details/125480206一、 逻辑运算符MySQL中支持4种逻辑运算符:运算符作用NOT或!逻辑非AND或&&逻辑与OR或||逻辑或XOR逻辑异或以上4种逻辑运算符都非常简单,如果有其他编程语言的基础,看一下以下的例......
  • 【MATLAB源码-第171期】基于matlab的布谷鸟优化算法(COA)无人机三维路径规划,输出做短路
    操作环境:MATLAB2022a1、算法描述布谷鸟优化算法(CuckooOptimizationAlgorithm,COA)是一种启发式搜索算法,其设计灵感源自于布谷鸟的独特生活习性,尤其是它们的寄生繁殖行为。该算法通过模拟布谷鸟在自然界中的行为特点,为解决各种复杂的优化问题提供了一种新颖的方法。从算法......
  • 17天【代码随想录算法训练营34期】第六章 二叉树part04(● 110.平衡二叉树 ● 257.
    110.平衡二叉树#Definitionforabinarytreenode.#classTreeNode:#def__init__(self,val=0,left=None,right=None):#self.val=val#self.left=left#self.right=rightclassSolution:defgetDepth(self,root):......
  • 贪心算法|53.最大子序和
    力扣题目链接classSolution{public:intmaxSubArray(vector<int>&nums){intresult=INT32_MIN;intcount=0;for(inti=0;i<nums.size();i++){count+=nums[i];if(count>result){......
  • 贪心算法|376.摆动序列
    力扣题目链接classSolution{public:intwiggleMaxLength(vector<int>&nums){if(nums.size()<=1)returnnums.size();intcurDiff=0;intpreDiff=0;intresult=1;for(inti=0;i<nums.size(......
  • P4551 最长异或路径 题解
    题目链接:最长异或路径看到树上路径问题,且是异或和这种,先思考树上前缀和转化为前缀和问题。如果我们预处理出\(pre[curr]\)表示\(curr\)这个点到根的前缀异或值,那么很显然我们路径的两个点\(u\)与\(v\)的\(pre[u]\opluspre[v]\)和传统的加法的树上前缀和并不一样,因为异......
  • 代码随想录算法训练营第二天 | 59.螺旋矩阵
    leetcode59.螺旋矩阵题目59.螺旋矩阵给你一个正整数n,生成一个包含1到n2所有元素,且元素按顺时针顺序螺旋排列的nxn正方形矩阵matrix。解题思路构建一个n行n列的二维数组计算转几圈(注意n为奇数时,转圈结束后会剩余一个中心点)填充每圈的数值--最外层循环每圈按......
  • 浅谈威廉希尔足球app比分源码Java算法
    我写了一套足球篮球比分的助手,说起来和澳客的口袋app有点相似,我仿照了它需要研究源码的朋友可以交流下目前项目已经线下实体店投入运营前端支持Android和iOS后台是Java威廉希尔足球app78888.ME ......
  • 经典机器学习算法:线性回归。逻辑回归。决策树。支持向量机(SVM)。朴素贝叶斯(Naive Baye
    目录经典机器学习算法分别举例说明这些算法的应用,并对比优劣以及实际应用场景。......
  • C++数据结构与算法——回溯算法组合问题
    C++第二阶段——数据结构和算法,之前学过一点点数据结构,当时是基于Python来学习的,现在基于C++查漏补缺,尤其是树的部分。这一部分计划一个月,主要利用代码随想录来学习,刷题使用力扣网站,不定时更新,欢迎关注!文章目录一、77.组合二、216.组合总和III三、17.电话号码的字......