• 不用临时变量,交换两个数的值

    2009-04-19 16:15:01 by deepblue

    有两个整型变量a,b,如何在不使用其他临时变量的情况下交换a,b的值?可能这个问题大家都非常熟悉了吧。

    以前我用的是这个方法:

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

    其实下面这种方法由于是用的位运算,因此效率更高:

    a=a^b; (1)
    b=b^a; (2)
    a=a^b; (3)

    其中,^为位运算的异或运算。证明这个结论也很简单,为了表述得清楚,我们令原始值分别为a,b,计算过程中产生的新值为a_new,b_new。

    由(1)得:a_new=a^b,即此时变量a中的值等于a_new。而(2)中,等式右边的a的值实际上已经等于a_new了,因此,由(2)得b_new=b^a_new=b^a^b。我们知道,异或运算满足交换律和结合律,因此进一步可以得到:b_new=b^a_new=b^a^b=b^b^a=0^a=a,即变量b的值变成了b_new,也就是变量a的原始值。在(3)中,等式左边变量a和b的值实际上已经等于a_new和b_new了,令等式左边的a为a_final,因此可以得到a_fianl=a_new^b_new=a^b^a=a^a^b=0^b=b,即变量a的值最终等于a_final,也就是变量b的原始值。至此,变量a,b的原始值完成了交换。


    收藏到:Del.icio.us




    评论

  • python里直接:
    >>> a, b = 1, 2
    >>> a, b = b, a
    >>> a
    2
    >>> b
    1

    deepblue回复azalea说:
    嗯,我上面的代码是用的C语言,请问一下这几行python语句的内部实现机制是怎样的呢?
    2009-05-01 01:38:01