不用中间变量交换两个整数的值

方法一:加减法

1
2
3
4
5
6
int a = 5;
int b = 10;

a = a + b; // a 现在是 15
b = a - b; // b 现在是 5
a = a - b; // a 现在是 10

简单,但是可能会溢出。

方法二:异或运算

1
2
3
4
5
6
int a = 1;
int b = 2;
a = a ^ b; // (1)
b = a ^ b; // (2)
a = a ^ b; // (3)
// a = 2, b = 1

首先介绍异或运算的几条性质:

  • 交换律:\(a \oplus b = b \oplus a\)
  • 结合律:\((a \oplus b) \oplus c = a \oplus (b \oplus c)\)
  • 逆元:\(a \oplus a = 0\)
  • 单位元:\(a \oplus 0 = a\)

利用这些性质证明:

将 (1) 代入 (2):\(b = (a \oplus b) \oplus b = a \oplus (b \oplus b) = a \oplus 0 = a\)

将 (1) 和 (2) 代入 (3):\(a = (a \oplus b) \oplus a = b \oplus (a \oplus a) = b \oplus 0 = b\)

使用异或运算交换两个整数的值,不会溢出。


不用中间变量交换两个整数的值
http://blog.qzink.me/posts/不用中间变量交换两个整数的值/
作者
Qzink
发布于
2025年3月10日
许可协议