什么是异或运算
- 异或运算,符号为XOR或者^,为二进制的运算
- 当运算法则相同时为0,不同为1。
- 异或运算的原理,推荐 史上最通俗易懂的异或运算详解
异或的运算性质
- 交换律:a ^ b = b ^ a;
- 结合律:(a ^ b ) ^ c = a ^ ( b ^ c );
- 任何数与0异或都是它本身:a ^ 0 = a;
- 任何数与它本身异或结果都是0:a ^ a = 0;
异或运算操作
-
交换两个数的值(代码中有注释,直接看吧)
public class Xor { public static void main(String[] args) { int a = 5; int b = 8; // a = a^b^a; // 这样就直接变成了b,b成不了a a = a^b; b = a^b; // 此时 b=a^b^b=a 因为a=a^b; a = a^b; // 此时 a=a^b^a=a 因为a=a^b;b=a System.out.println(a); System.out.println(b); } } -----------------运行结果-------------- 8 5
-
检查数组中唯一出现的元素(或找到出现奇数次的元素)
-
思路:
任何数和0异或都等于它本身,而任何数和它自身异或的结果都是0。因此,多次异或操作后,所有出现偶数次的元素都会相互抵消为0,而出现奇数次的元素则会保留下来
-
不写代码了,自己去做一道题吧 leetcode 136. 只出现一次的数字
-
-
检查数组中唯一出现的元素
1、也适用于奇数和偶数次的。但必须是有且仅有一个出现了偶数次
2、如果数组的数值不是规律的,需要借助额外的空间(异或本来是为了避免额外空间的)
3、数组如果是规律的,不需要额外的空间import java.util.HashSet; import java.util.Set; public class XorDump { public static void main(String[] args) { // 求出现偶数次的数值,必须有且只有一个数出现了偶数次 // arr1为不规律的数组 int[] arr1 = {1,2,9,9,3,4,4,9,10,9,2,3,5,2,3,4,6}; // 依次将数值存入set集合中,然后进行异或 Set<Integer> set = new HashSet<>(); for (int i : arr1) { set.add(i); } int n1= 0; for (Integer integer : set) { n1 = n1^integer; } for(int j=0;j<arr1.length;j++){ n1 = n1 ^ arr1[j]; } System.out.println("n1为:"+n1); //--------------分割线----------- int[] arr2 = {1,2,3,4,2,5,6,7,8}; int n2 = 0; for(int i=1;i<=8;i++){ n2 = n2 ^ i; } for (int i : arr2) { n2 = n2 ^ i; } System.out.println("n2为:"+n2); } -------------------运行结果-------------------- n1为:9 n2为:2