文章目录
- 前言
- 一、什么是异或运算?
- 二、应用
- 1.数组异或操作( a ^ b = c, a ^ c = b, b ^ c = a的应用)
- 2.只出现一次的数字(x ^ 0 = x, x ^ x = 0的应用)
- 3.丢失的数字( a ^ b ^ b = a ,x ^ 0 = x, x ^ x = 0的应用)
前言
很多题目用正常的思路解题会很复杂,但是用异或运算会快速解决问题,所以这一次我们来深入学习异或运算。
一、什么是异或运算?
1.定义:异或,是一个数学运算符,英文为exclusive OR,缩写为XOr,应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“XOR”;
2.其运算法则为:
x ^ 0 = x, x ^ x = 0
x ^ (~0) = ~x, x ^ (~x) = ~0
a ^ b ^ b = a;
a ^ b = c, a ^ c = b, b ^ c = a
3.遵循的规则是:相同为0,不同为1;
4.本质上是一种将十进制转化为二进制的运算;
二、应用
1.数组异或操作( a ^ b = c, a ^ c = b, b ^ c = a的应用)
代码如下(示例):
int xorOperation(int n, int start){
int i;
int result = start;//定义一个新的变量记录结果
for(i = 1;i < n; i++)
//用循环实现每一个start的值
{
result = result ^ (start + 2*i);//进行异或运算
}
return result;
}
2.只出现一次的数字(x ^ 0 = x, x ^ x = 0的应用)
思路:
异或运算遵循相同为0,不同为1的规则,在这里两个相同的数字的二进制是相同的,他们进行异或,得到的结果为0,再与另外单独出现的数字进行异或,就会得到单独数字的二进制,转化为十进制就是最后的答案了(如果还不明白建议拿笔自己试一试)。
代码如下(示例):
int singleNumber(int* nums, int numsSize){
int a = 0;
for (int i = 0; i < numsSize; i++)
{
a = a ^ nums[i];
}
return a;
}
3.丢失的数字( a ^ b ^ b = a ,x ^ 0 = x, x ^ x = 0的应用)
思路如下:
数组中的数字一定会和数组的下标构成一对重复数字,重复的数字经过异或运算最终结果为0。其中,N 可以和数组的长度构成一对重复,因此最终还要异或一下数组的长度,那么一个循环下来,最后的结果就是那个消失的数;举个例子,在第一个示例中,数组长度为3,数组中有3,0,1三个数字,3,0,1会和总能找到数组下标0,1,2相对应,最后再和数组长度3异或,相同的数字异或为0,剩下的就是缺失的数字了。
代码如下(示例):
int missingNumber(int* nums, int numsSize){
int result = numsSize;
for(int i=0;i<numsSize;i++){
result ^= nums[i] ^= i;
}
return result;
}