Java中 ^(异或)的妙用

引子

交换两个数的值,a = 10, b = 20;
这个很简单,大家都会,即新定义一个变量做中间量,然后交换,如下:

	int a = 10, b = 20;
	int temp = a;
	a = b;
	b = temp;

那么,问题来了,如何在不定义中间变量,即空间复杂度为1的情况下交换两个数的值呢?

^的第一个妙用

首先解释一下^,即异或,在二进制中,两个数的对应位置的值相同则结果为0,不同为1.举个小例子: 3 ^ 4,即011 ^ 100,用数学是表示为

结果为7.同理,3^3的结果为0.
注意:
        1. 异或满足交换律,结合律的数学规律
        2. 任何一个数异或0结果为它自身.

想必大家已经明白^的用法了,那么如何用它来交换两个数的值呢,我们分三步走:
    第一步: 替换a的值
    第二步:将a的值给b
    第三步:将b的值给a
代码如下:

a = a ^ b;		//此时a的值为a^b用来暂存a和b的值
b = a ^ b;		//即 b = (a ^ b) ^ b = a ^ (b ^ b) = a ^ 0 = a; 此时b的值为a
a = a ^ b;		//即 a = (a ^ b) ^ a = a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b; 此时a的值为b,交换完毕

^的第二个妙用

LeetCode第136题:只出现一次的数字
        给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
分析: 题干中说元素要么出现一次要么出现两次,配合我们上面的内容是否很容易想到解题方法.相同两数的异或为0,0与任何数异或的结果为他自身.
代码如下:

public int singleNumber(int[] nums) {    
        int a = 0;
        for(int i : nums)
            a ^= i;
        return a;
    }

我想只要理解了^的本质,上面的代码还是很好理解的!
如果还有更多关于异或的妙用,可以告诉我,谢谢大家.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值