首页 > PHP > PHP中不使用第三方变量交换两个数字的值

PHP中不使用第三方变量交换两个数字的值

在学习程序语言和进行程序设计的时候,交换两个变量的值是经常要使用的,通常做法是定义一个临时变量,然后通过赋值进行交换。

//推荐:使用临时变量交换2个数
function change($x, $y)
{
    // 将$x赋给$t临时变量
    $t = $x;
    
    // 将和值减去$y即可得到原来的$x,并将$x赋给$y
    $x = $y;
    
    // 将$t赋给$y
    $y = $t;
    
    return array($x, $y);
    
}

这种方式虽然效率不怎么样,但是非常容易理解,而且复用性特别到,无论是什么类型的变量都能交换。

可问题来了,要求不使用第三方变量交换两个数的值,这时考虑到时2个数,于是使用下面的算法完成:

//结论1:任何2个数相加等于这2个数交换之后相加的数
function change1($x, $y)
{
    // 我们将$x + $y的值相加得到和
    $x = $x + $y;
    
    // 将和值减去$y即可得到原来的$x,并将$x赋给$y
    $y = $x - $y;
    
    // 将和值减去$y即可得到新的$y,就能得到新的$x
    $x = $x - $y;
    
    return array($x, $y);
    
}

很明显,此方法在整型,浮点型类型数据是可以完成的,但是和值不能太大超过范围,例如PHP在32位系统下的整型范围为-2147483648~2147483647,64位系统的整型范围为-9223372036854775808~9223372036854775807。

另外,如果是交换2个字符串,此方法必然失效。


后来知道使用异或可以交换2个数还不使用第三方变量,据说效率非常高。

//结论2:一个数求异或2次将会得到这个数本身,即x^y^y==x,另外x^y == y^x
function change2($x, $y)
{
    // 我们求$x对$y的异或值
    $x = $x ^ $y;
    
    // 将异或后的值再次异或$y即可得到原来的$x,并将$x赋给$y
    $y = $x ^ $y;
    
    // 我们知道$x^$y^$y得到是原来的$x, $y^$x^$x将会得到原来的$y,
    // 而此时(原来的$x) == (现在$y), 而我们通过x^y == y^x结论可知,
    // $x^$y可以写作$y^$x, 那么$y^$x^$x == ($x^$y)^$x, 
    //我们只需要知道原来的$x就可以得到原来的$y然后赋给新的$x, 上一步操作中我们已经得到了原来的$x(新的$y), 所以再次异或$y即可
    $x = $x ^ $y;
    
    return array($x, $y);
    
}

亲自动手测试了一些数据,发现此方法只适合整型或字符串,浮点型直接就自动转为整型了。所以如果是需要交换2个不确定的变量时,还是推荐第一种使用临时变量的方法。


文章链接:http://blog.zhengshuiguang.com/php/change-int.html

随便收藏,请保留本文地址!

标签:笔试 交换 异或

评论已关闭