文章目录

  • 前言
  • 一、什么是异或运算?
  • 二、应用
  • 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的应用)

hex 异或 lua 异或运算xor_排序算法

代码如下(示例):

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的应用)

hex 异或 lua 异或运算xor_算法_02


思路:

异或运算遵循相同为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的应用)

hex 异或 lua 异或运算xor_数组_03


思路如下:

数组中的数字一定会和数组的下标构成一对重复数字,重复的数字经过异或运算最终结果为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;
}