不使用其他变量,交换两个变量的值。
/*
* 方法壹。
*
* 因为异或运算满足交换律和结合律,且 A^A = 0, 0^A = A,
* 所以用下面过程可以交换 A, B: (用 a, b 表示原始的 A, B 值)
* 1) A = A^B
* 2) B = A^B // B = A^B = (a^b)^b = a^(b^b) = a^0 = a
* 3) A = A^B // A = A^B = (a^b)^a = (b^a)^a = b^(a^a) = b^0 = b
*/
void swap_in_space(int & a, int & b)
{
a = a ^ b;
b = a ^ b;
a = a ^ b;
}
/* 方法贰。 */
void swap_in_space(int & a, int & b)
{
a = a + b;
b = a - b;
a = a - b;
}
注:
1. 方法壹比方法贰高效。
2. 方法贰中的加法操作有溢出的可能,但在此题中溢出不影响结果的正确性。
3. 方法贰中的加减可以分别替换成乘除,但效率更低,而且此时溢出会影响结果的正确性。
参考:
1. http://hi.baidu.com/kebing/blog/item/ab690c33bf26b7f81a4cff08.html
2. http://hi.baidu.com/kebing/blog/item/a32e62d01989188fa0ec9cf1.html