Java中通过三步异或来交换两个数

代码中经常需要交换两个数的值,常见方法是新建一个中间变量temp,通过temp暂存数字的方法实现交换。

int a=5;
int b=10;
int temp;

//交换
temp=a;
a=b;
b=temp;

现在通过 异或操作^ 来实现交换。

int a=5;
int b=10;

//交换
a=a^b;
b=a^b;
a=a^b;
System.out.println("a和b的值分别是: "+a+" "+b);

输出:在这里插入图片描述
结果可以看出,在没有中间变量的情况下,只进行3步异或操作就实现了交换,这是怎么一回事呢?

要从异或的性质说起,主要有四个:
在这里插入图片描述
再回到上例代码中,第二步b=a ^ b,其实际数学表达是b=( a ^ b )^ b,由交换律和结合律可知,结果为a;
同理,第三步a=a ^ b,实际上是 a=(a ^ b) ^ ((a ^ b) ^ b),结果为b。

通过异或的办法可以巧妙的避开中间变量的问题,在数组操作时可以更加精炼。如下例:
反转数组中的元素:

        int[] c1= new int[5];
        for (int i=0; i<5; i++){
            c1[i]=(int)(Math.random() * 10);
            System.out.println("c1的第"+(i+1)+"个数是: "+c1[i]);
        }
        for (int i=0; i<(c1.length)/2; i++){
            c1[i] = c1[c1.length - i - 1] ^ c1[i];
            c1[c1.length - i - 1] = c1[c1.length - i - 1] ^ c1[i];
            c1[i] = c1[c1.length - i - 1] ^ c1[i];
        }
        for (int i=0; i<c1.length; i++){
            System.out.println("反转后c1的第"+(i+1)+"个数是: "+c1[i]);
        }

输出:在这里插入图片描述

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值