Java-随便记记-异或运算实现变量值交换-补充此前的【实现变量值交换】一节

0.开头

之前一篇https://blog.csdn.net/qq_32760017/article/details/88891468
《Java-随便写写-实现变量值交换和随机数的生成》只写了两种基本的方法;
这里补充异或实现变量值交换的方法。

1.先结论

直接上代码:

public class ExchangeValue {
    public static void main(String[]args){
        int a = 55;
        int b = 66;
        a = a^b;
        b = a^b;
        a = a^b;
        System.out.println("a="+a);
        System.out.println("b="+b);
    }
}

运行结果没有问题:

a=66
b=55

2.后原理

为什么连续三次异或能够实现数值交换呢?

a = a^b;//第一句
b = a^b;//第二句
a = a^b;//第三句

我们一句一句看:

  • a = a^b:第一句实际上是在【记录】两个数当中【不一样】的比特位!
    (i)为什么这么说?
    (ii)我们思考a和b的二进制形式,异或计算之后二者不同的位置都变成了 【1】,相同位置都变成了【0】;
    (iii)计算完成后,a存储的其实就是不同位位置为【1】,相同位位置为【0】的信息;
  • b = a^b:第二句实现了将a的二进制位值全部传递给了b!
    (i)具体是如何实现的呢?
    (ii)我们把这个交换值的问题分解:a的值要传给b,那么只要【换掉b中和a不一样的位】就好了!
    (iii)而第一句我们说了,a在经过第一步之后,相同位位置是【0】,不同位位置都是【1】;所以,第二句的运算过程中,b遇到【1】时希望换掉自己的值,遇到【0】时值不变。
    (iiii)实际上呢?正是如此!无论b对应位置是【1】还是【0】,遇到【0】异或之后都不会变;另一边,无论b对应位置是【1】还是【0】,遇到【1】都会变!所以完成任务!
  • a = a^b;这一句与上面的一句是一样的!此时的a依然存储着不同位位置的【1】和相同位位置的【0】,此时的b已经成了之前的a,所以运算之后,刚好得到最原始的b值!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值