什么是异或
异或的运算方法是一个二进制运算:
1^1=0
0^0=0
1^0=1
0^1=1
两者相等为0,不等为1.
由此得出
0^N=N
N^N=0
2)异或运算满足交换律和结合率
a^b=b ^a
(a^b) ^c= a ^( b ^ c)
int a=甲;
int b=乙;
a=a ^b; a=甲 ^ 乙; b=乙;
b=a ^b; a=甲 ^ 乙; b=甲 ^ 乙 ^ 乙=甲 ;
a=a ^b; b=甲 a=甲 ^ 乙 ^ 甲=乙;
必须满足内存区域不能相等才能用异或运算
异或的题型
在一个数组中,整型数组,已知只有一种数出现了奇数次,其他数出现了偶数次
满足 时间复杂度o(N),空间复杂度未o(1)
找出奇数次的数
public static void printoddTimesNum1(int[]arr){
int eor =0;
for (int cur :arr){
eor ^=cur;
}
System.out.println(eor);
}
为什么这么写嗯
例如一个数组:
四个1 ;四个2 三个3
[1,3,2,1,2,3,1,2,3,1,2]
1^1 ^1 ^1 ^ 2 ^2 ^2 ^2 ^3 ^ 3 ^3=3;
因为
1^1 ^1 ^1=0;
2^2 ^2 ^2=0;
3^ 3 ^3=3;
在一个数组中,整型数组,已知只有俩种数出现了奇数次,其他数出现了偶数次
满足 时间复杂度o(N),空间复杂度未o(1)
找出奇数次的数
public static void printoddTimesNum1(int[]arr){
int eor =0;
for (int cur :arr){
eor ^=cur;
}
System.out.println(eor);
}
全部异或之后就剩俩个奇数的异或了,
也就是 a^b