Java^异或运算符应用
异或运算符的使用场景和说明
package com.cn.study;
/**
* 按位操作符,应用
*/
public class BitOpreationApply {
/**
* 互换两个变量的值,满足最低的空间复杂度.
* 示例:a = 5, b = 3
* 第一步:a = a ^ b; 6 = 5 ^ 3; 0101 异或 0011 = 0110
* 第二步:b = a ^ b; 5 = 3 ^ 6; 0011 异或 0110 = 0101
* 第三步:a = a ^ b; 3 = 6 ^ 5; 0110 异或 0101 = 0011
* 结果:a = 3; b = 5
* 证明:
* a1 = a ^ b
* b1 = a1 ^ b --> b1 = (a ^ b) ^ b 且 a ^ b ^ b = a ^ 0 = a
* b = b1 --> b = (a ^ b) ^ b
* a2 = a1 ^ b1 --> a2 = a ^ b ^ ((a ^ b) ^ b)
* a = a2 -- > a = (a ^ b) ^ ((a ^ b) ^ b) = a ^ b ^ a ^ b ^ b = b // 两个相同的值异或值为0,a ^ 0 的值为 a(自然数)
* @param a
* @param b
*/
public static void test(int a, int b) {
System.out.println("初始值:a = " + a + "; b = " + b);
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println("互换后值:a = " + a + "; b = " + b);
}
/**
* 获取数组中不重复数字。假设数组中非重复值,仅有一个。满足最低的空间复杂度
* 根据上个函数结论:两个相同的值异或值为0,a ^ 0 的值为 a(自然数)。可以使用^运算符解决。
* @param nums 数组
* @return 唯一数
*/
public static int test1(int[] nums) {
int a = 0;
for (int num : nums) {
//System.out.println("a1:" + a);
a = a ^ num;
//System.out.println("a2:" + a);
}
return a;
}
public static void main(String[] args) {
int[] nums = {2, 3, 5, 2, 3};
/** 相同位的两个数字对应的二进位相异时,结果为1。
* 循环1: 2 = 0 ^ 2 ==> 0000 异或 0010 = 0010
* 循环2: 1 = 2 ^ 3 ==> 0010 异或 0011 = 0001
* 循环3: 4 = 1 ^ 5 ==> 0001 异或 0101 = 0100
* 循环4: 6 = 4 ^ 2 ==> 0100 异或 0010 = 0110
* 循环5: 5 = 6 ^ 3 ==> 0110 异或 0011 = 0101
*
* 如何理解?
* 两个相同的值异或值为0,a ^ 0 的值为 a(自然数)。
*/
System.out.println(test1(nums));
test(5, 3);
}
}
运行结果:
5
初始值:a = 5; b = 3
互换后值:a = 3; b = 5
结论
^ 运算符的使用虽然不多。但在理解其原理后在平常代码中还是可以做一些应用的。