1.什么是异或运算
异或运算是位运算的一种,符号为:^
运算规则为:相同为0,不同为1
例如
性质:
N ^ 0 = N
N ^ N = 0
A ^ B = B ^ A
(A ^ B) ^ C = A ^ (B ^ C)
- N ^ 0 = N
public class XorOperation {
public static void main(String[] args) {
System.out.println(zeroXorNonZeroNum(5)); // 5
}
// 0与非零数异或
private static int zeroXorNonZeroNum(int n) {
return 0 ^ n;
}
}
位与位异或,相同为0,不相同为1,所以b的结果为5
- N ^ N = 0
public class XorOperation {
public static void main(String[] args) {
System.out.println(nonZeroXorSelf(5)); // 0
}
// 非零数与自身异或
private static int nonZeroXorSelf(int n) {
return n ^ n;
}
}
两个相同的数,二进制都是一样的,所以在位与位进行异或的时候都相同,每一位的结果都是0
- 交换律
public class XorOperation {
public static void main(String[] args) {
System.out.println(twoNonZeroNumXor(3, 8)); // 11
System.out.println(twoNonZeroNumXor(8, 3)); // 11
}
// 两个非零数异或运算
private static int twoNonZeroNumXor(int a, int b) {
return a ^ b;
}
}
因为异或是位与位进行计算的,所以异或的顺序不重要,结果是一样的
- 结合律
int a = 2;
int b = 5;
int c = 4;
int d = (a ^ b) ^ c;
int e = a ^ b ^ c;
int f = a ^ (b ^ c);
System.out.println(d == e); //true
System.out.println(f == e); //true
通过交换律得知,异或的顺序不会影响结果,所以在某一些数先异或,再异或另个数的时候,也不会影响结果,这就是异或满足结合律
2.异或运算的本质
2.1 2阶异或运算
来看一个例子:
(10进制)5 = (二进制)00000101 (10进制)6 = (二进制)00000110
5 ^ 6 计算过程如下:
相同为0,不同为1
2.3 3阶异或运算
来看一个例子:
(10进制)5 = (三进制)00000012 (10进制)6 = (三进制)00000020
5 ^ 6 计算过程如下:
2 ^ 0 = 2,1 ^ 2 = 0
2.4 4阶异或运算
来看一个例子:
(10进制)5 = (四进制)00000011 (10进制)6 = (四进制)00000012
5 ^ 6 计算过程如下:
1 ^ 2 = 3,1 ^ 1 = 2