异或运算 是什么运算

异或运算可以理解为无进位运算相同为0,相异为1
a:1 0 1 1 0b:0 0 1 1 1--------------1 0 0 0百思特网 1
异或满足的数学规律
1)0^N = N N^N = 0
2)满足交换百思特网律和结合律
a^b = b^a (a^b)^c = a^(b^c)
使用异或交换两个变量的值//使用异或交换两个变量的值public static void swap(){int a = 8;int b = 10;System.out.println("a=" a" ""b="b);a = a ^ b;b = a ^ b;a = a ^ b;System.out.println("a=" a" ""b="b);}//res百思特网ulta=8 b=10a=10 b=8
解释:int a = 甲;int b = 乙;a = a ^ b; //a=甲^乙b=乙b = a ^ b;//a=甲^乙b=甲^乙^乙=甲^0=甲a = a ^ b; //a=甲^乙^甲=甲^甲^乙=0^乙=乙 b = 甲
注意:使用异或交换两个变量的值的前提为,变量a与变量b分别是不同的内存,当a,b是同一个内存的话,a^b的值存入这个内存,此时内存的值会一直为0
异或相关习题在一个整型数组中,(要求时间复杂度O(N),空间复杂度O(1))
1)已知在数组中只有一种数出现了奇数次,其他所有数都出现了偶数次,找出出现了奇数次的数
public static void printOddTimesNum1(int[] arr){int eor = 0;for (int cur : arr) {eor ^= cur;}System.out.println(eor);}
2)已知在数组中有两种数出现了奇数次,其他所有数都出现了偶数次,找出出现了奇数次的数
首先,定义一个变量将数组中的所有数进行异或运算,此时变量eor的值就是a^b的值,因为是两种数,所以a!=b,所以eor!=0,所以eor的二进制位上必定有一位是1,假设eor的第八位为1,则a的第八位和b的第八位不同,则通过异或第八位为0的数就能找出a,b中的一个值,再将得到的值与eor异或,就能的到另一个值 。
通过异或第八位为0的数就能找出a,b中的一个值:首先将数组分为两大类,其中一类第八位为1,另一类第八位为0,则a,b处在不同的分类中
对第一类中的值进行异或运算就会得到a的值:为什么,其他的数异或时不会造成影响吗?
不会,首先其他的数都出现了偶数次,异或运算可以可看成无进位的加法运算,在二进制运算时就可以看成,每一位的运算不影响其他位的值,既然a,b第八位最后异或的结果为1,那么其他的第八位数异或结果必定为0,把这些数也分为两大类,那么第八位为1的其他数异或到最后必定为0,即出现了偶数次,不然第八位为0的其他数异或到最后为0,第八位为1的数(除a之外)为奇数次的话异或到最后为1,再与a异或就是0,0^0为0,不成立,所以第八位为1的其他数只能出现偶数次,其他数进行异或运算后为0,对第一类进行异或运算就会得到a的值 。
【异或运算 是什么运算】public static void printOddTimesNum2(int[] arr){int eor = 0,onlyOne = 0;for (int curNum : arr) {eor ^= curNum;}//eor = a ^ b//eor != 0//eor必然有一个位置上是1int rightOne = eor

    推荐阅读