异或运算的规则就是两个相同的数异或之后的结果为0,0和其他不为0的数异或之后的结果为后者,而且异或运算支持交换律和结合律,有了这些定义使得有些算法可以很巧妙的使用异或运算解决问题。
一.交换两个数的值
我们平时交换两个数的一般写法是借助中间变量来实现的,而用异或运算可以不用中间变量。
public static void main(String[] args) {
int a=10;
int b=20;
a=a^b; //第一步
b=a^b; //第二步
a=a^b; //第三步
System.out.println("a="+a);
System.out.println("b="+b);
}
由于异或运算满足交换律和结合律,由第一步a=a^b可以得出第二步b=a^b=(a^b)^b=a^(b^b)=a^0=a;
同理第三步a=a^b=a^(a^b)=(a^a)^b=0^b=b;
这样就可以不用中间变量就把a和b两个值交换了。
运算结果:
二.加法运算
如何不使用+号实现两个数相加?答案是异或,两个数异或的结果就是它们相加的结果。
public static void main(String[] args) {
int a=3; //二进制表示11
int b=4; //二进制表示100
// 0 1 1
// 1 0 0
// ^——————
// 1 1 1 =7
System.out.println(a^b);
int c=5;
int d=10;
// 0 1 0 1
// 1 0 1 0
// ^————————
// 1 1 1 1=8+4+2+1=15
System.out.println(c^d);
}
运行结果:
三.只出现一次的次数
这是一道来自LeeCode的题目:
有了异或运算就很简单了,每个数组里面的数异或一次,根据交换律结合律,实例2的数据异或的结果会变成(1^1)^(2^2)^4=4。
public int singleNumber(int[] nums) {
if(nums.length==0) return 0;
int temp=nums[0];
for(int i=1;i<nums.length;i++){
temp=temp^nums[i];
}
return temp;
}
提交结果:
异或运算还有许许多多巧妙的应用,以后遇到了再一一分享出来。