不使用其他变量,交换两个变量的值


不使用其他变量,交换两个变量的值。

/*
 * 方法壹。
 *
 * 因为异或运算满足交换律和结合律,且 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值