简单的难题(一) Java

在不使用新变量的前提下,交换变量a和变量b的值

public class Swap {
    public static void main(String[] args){
        int a = 10;
        int b = 20;

        System.out.println("a="+a);
        System.out.println("b="+b);
    }
}

通常我们在交换变量的值都会通过创建临时变量来交换两个变量的值,如下图所示

public class Swap {
    public static void main(String[] args){
        int a = 10;
        int b = 20;
        int temp;    //临时变量
        
        temp = a;    //将a赋值给temp
        a = b;       //将b赋值给a
        b = temp;    //将temp赋值给b
        
        System.out.println("a="+a); //输出结果 a=20
        System.out.println("b="+b); //输出结果 b=10
    }
}

疑问:当限制无法采用新的变量进行传值之后,我们该如何对a和b进行值交换的操作呢?

这里需要了解一下异或的概念:

异或是一个数字运算符,英文名为exclusive OR,缩写为xor,应用于逻辑运算,异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为: a⊕b = (¬a ∧ b) ∨ (a ∧¬b)

如果a、b的值不相同,则异或结果为1;

如果a、b的值相同,则异或结果为0;

例: 当a的二进制为:1010,b的二进制位1101时

a:     1010

b:     1101

——————

结果:0111

思路:我们可以称a的原码为原文,与其进行异或操作的另一个值的原码称为密钥,将其异或后的值称为密文,当a与b异或后的密文再与a或者b的原文进行异或操作,是否就可得到另一个值的原文,并对其进行赋值操作?

解决:当a = 10时,其二进制为01010,当b = 20时,其二进制为10100,异或操作后所得到的密文则为11110。

public class Swap {
    public static void main(String[] args){
        int a = 10;    //二进制为:01010
        int b = 20;    //二进制为:10100
        
        a = a^b;    //异或结果为11110,当前a表示原文,b表示密钥,结果表示密文
        b = a^b;    //当前a为密文值11110,b表示原文10100,其异或结果为01010
        a = a^b;    //当前b为01010,a为密文值11110,其异或结果为10100
        
        //结果输出为十进制值
        System.out.println("a="+a); //输出结果 a=20
        System.out.println("b="+b); //输出结果 b=10
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值