不用临时变量交换两个数据

利用一个小技巧,一个整数a在异或另一个整数b两次以后所得的值还是整数a。

具体的过程我们可以自己找两个整数以二进制的形式自己在纸上画一下他们的异或过程。(异或的运算符号为"^")

比如:

 

下面给出交换两个整数位置的代码,不需要临时变量temp。运行结果:

public class Aa {

    public static void main(String[] args) {

        int a = 3, b = 5;

        System.out.println("before swap:" + "a=" + a + ",b=" + b);

        // 开始交换位置

        a = a ^ b; 

        b = a ^ b; // b=a^b^b=a

        a = a ^ b; // a=a^b^a^b^b=b

        System.out.println("after swap:" + "a=" + a + ",b=" + b);

    }

}
before swap:a=3,b=5
after swap:a=5,b=3

转载自:https://www.cnblogs.com/kkkky/p/7741604.html

通过指针直交换两个数的使用额外的临时变量,在 C/C++ 中是一种常见的技巧。下面将为你详细介绍如何利用指针完成这一操作,并附上简单的示例代码。 ### 操作原理 假设我们有两个整型数 `a` 和 `b` ,想要将其内容互换而不用借助第三个辅助空间。对于这种情况,可以采用数学运算的方式来进行数据转换: 1. **加减法**:先让其中一个数字加上另一个,则该位置保存了两者之和;然后从这个总和里扣除原第二个数得到第一个原始并赋给后者;最后再用新得到的结果去更新前者即可。 - a = *pa; - b = *pb; 2. **异或 (XOR)** :更巧妙的是运用位元运算符中的“按位异或”,这种方式会引起溢出的问题。它依赖于以下特性: - x ^ x == 0 (任意数与其自身做 XOR 运算结果为零) - x ^ 0 == x (任一数与零作 XOR 结果变) 因此只需要对两个交换的位置连续进行三次相同的 XOR 操作就可以达到目的了。 ```c++ void swapWithoutTemp(int* pa, int* pb) { if(pa != nullptr && pb != nullptr){ // Method using arithmetic operations /* * *pa += *pb; * *pb = *pa - *pb; * *pa -= *pb; */ // OR //Method Using Bitwise XOR Operation if (*pa != *pb) *pa ^= *pb ^= *pa ^= *pb ; } } ``` 需要注意的一点是在某些特殊情况下,比如当两个指向同一内存地址时(即自引用),上面提到的方法可能会导致可预期的行为。所以在实际编写程序的时候应该考虑到这一点,增加适当的判断条件来避免潜在的风险。 此外,虽然上述方法确实实现了使用临时变量的目标,但从可读性和安全性角度来看,通常还是推荐使用一个明确声明的临时变量来进行交换,特别是在处理复杂的数据结构或是需要保证线程安全性的环境中更是如此。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值