Java面试题---只用两个变量,如何做到把两个整数交换?

题目:只用两个变量,如何做到把两个整数交换?

一般正常没有限制,我们用三个变量,是这样做的。这里写图片描述
这个学过一点点C或者编程语言的都会,这里用到了三个变量。那么只用两个变量,如何做呢?、

答案是 “异或” “^”

首先理解什么是 异或 运算? 把两个数转化为二进制,两个数一个为0 一个为1 的时候 结果才为1 其余结果为0
这里写图片描述

所以对于 异或 我们会发现以下运算规律

一个数和本身进行 异或 运算结果为 0
这里写图片描述
一个数和0 进行异或运算 结果 还是他本身
这里写图片描述

两个相同的数进行异或,结果为: 0
任意数和0进行异或,结果为: 本身

回到这个问题来。
假设两个数为a,b. 我们只要把 a 和 b进行异或运算 (a^b) 在任意和原来的a 进行异或运算(a^b^a=b^0=b) 或者和原来的b进行异或运算(a^b^b=a^0=a)就可以得到b .按照这个思路就可以用两个变量完成

//面试题: 要求不能使用第3个变量 把两个整数进行交换
        int a=120;
        int b=11;
        a = a^b;
        b = a^b; //此时b就是原来的a 了 120  (a^b)^b ==> a^(b^b) ==> a^0 ==> a
        a = a^b; //这就是真正的 a^b^a 就是原来的b 了 11  (a^b)^a ==> b^(a^a) ==> b^0 ==> b

下图是交换的整个过程
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值