代码
//通过异或运算实现两个变量的交换
int a=9;
int b=10;
a=a^b;
b=a^b;
a=a^b;
基础原理
- 相同为0,相异为1,也称为无进位的加法
1^1=0;
0^0=0;
1^0=1;
0^1=1; - 交换率和结合率
A ^ B ^ C = A ^ C ^ B
A ^ B ^ C = A ^ (B ^ C)
任何数异或自己都等于0
A^A=0
任何数异或0都等于自己
A^0=A
代码解释
//假设a=甲,b=乙
a=a^b;
//此时,a ^ b=甲^乙,此时a=甲 ^ 乙
b=a^b;
//此时b=甲 ^ 乙 ^ 乙=甲 ^ (乙 ^ 乙)=甲^0=甲,即,此时b=甲,也就是原来的a
a=a^b;
//此时a=甲 ^ 乙 ^ 甲=甲 ^ 甲 ^ 乙 = 0^乙=乙,即此时a=乙,也就是原来的b
相关题目及算法
在一个长度为N的int数组中,只有一种数存在了奇数次,其他的都是存在了偶数次,请问如何使用O(N)的算法找出这个数字?
代码
public class Yihuo01 {
public static void main(String[] args) {
int[] arr= {1,2,3,4,5,1,7,2,3,4,5,2,2,6,6};
System.out.println(search(arr));
}
public static int search(int[] nums) {
int target = 0;
for (int num : nums) {
target ^= num;
}
return target;
}
}
分析
原理分析
1. 数组中的所有数字进行异或操作,最后只会剩下一个数字,而且结果与顺序无关
2. 假设把数组排序好,那么所有偶数的数字进行异或结果就是0
3. 最后剩下的就是奇数个的那个数字
4. 代码中的例子进行举例
5. 1 ^ 2 ^ 3^ 4^ 5^ 1^ 7^ 2^ 3^ 4^ 5^ 2^ 2^ 6^ 6=(1^1) ^ (2 ^2 ^ 2 ^ 2 ) ^ ( 3 ^ 3 ) ^ ( 4 ^ 4 ) ^ ( 5 ^ 5 ) ^ 7 ^ (6 ^ 6 )=0 ^ 7=7