不用额外空间,交换两个数的值.

今天看到一个不用额外空间,交换两个数值的算法,感觉很酷。

a = a + b;
b = a - b;
a = a - b;

 

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

 

x ^= y;
y ^= x;
x ^= y;

x = x + y;
y = x - y;
x = x - y;

x = x - y;
y = y + x;
x = y - x;

x = y - x;
y = y - x;
x = x + y;

 

通过指针直接交换个数而不使用额外的临时变量,在 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 ; } } ``` 需要注意的一点是在某些特殊情况下,比如当个指向同一内存地址时(即自引用),上面提到的方法可能会导致不可预期的行为。所以在实际编写程序的时候应该考虑到这一点,增加适当的判断条件来避免潜在的风险。 此外,虽然上述方法确实实现了不使用临时变量的目标,但从可读性和安全性角度来看,通常还是推荐使用一个明确声明的临时变量来进行交换,特别是在处理复杂的数据结构或是需要保证线程安全性的环境中更是如此。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值