• 如何不运用第三方变量实现两个数的交换


    当遇到交换两个变量的时候,我们通常使用的是借助第三方变量实现两个数的交换。那么如果不使用第三方变量时,该怎么操作呢。

    下面有两种方法:

    1、通过已有的两个变量之间的加或减实现:

    这种方法对于两个都是无限接进int取值范围,而相加超出int取值范围的情况不适用。

    2、通过异或实现(异或符号为^)

    *******************************************************************************************************

    关于^:

         异或的运算法则,相当于不带进位的二进制加法。二进制下用1表示真,0表示假,则异或的运算法则为:0异或0=0,1异或0=1,0异或1=1,1异或1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位。

    第一个数 符号 第二个数 结果
    0 ^ 0 0
    0 ^ 1 1
    1 ^ 0 1
    1 ^ 1 0

    如:

    num1 = 5,对应的二进制为(101); num2 = 7,对应的二进制为(111);

    num1=num1^num2=2; 即二的平方位1^1=0,二的一次方位0^1=1,二的0次方位1^1=0;得到(010)即为2。

    num2 = num1 ^ num2=5 ;相当于num2=num1^num2^num2;二的平方位1^1^1=1(此处无论num2的二的平方位是0还是1,异或运算后都为0,故得到的肯定与原num1的二的平方位相同,同理其他位置全部也都是原num1的数);二的一次方位0^1^1=0;二的0次方位1^1^1=1.;得到(101)即为5.

    num1 = num1^num2=7; 相当于num1 = num1^num2^num1^num2^num2=num2=7.

    此方法同样实现了两个数互换。

    *******************************************************************************************************

    由于^符号是不进位的,所以即使两个都无限接进int取值范围的数。通过^运算,也不会超过int取值范围。 

    新手,懂得不是很多,如有错误或者更好的方法,请各位不吝赐教!!!!!!!!! 

  • 相关阅读:
    bzoj1644 [Usaco2007 Oct]Obstacle Course 障碍训练课
    bzoj1640 [Usaco2007 Nov]Best Cow Line 队列变换
    bzoj1639 [Usaco2007 Mar]Monthly Expense 月度开支
    bzoj1637 [Usaco2007 Mar]Balanced Lineup
    bzoj1641 [Usaco2007 Nov]Cow Hurdles 奶牛跨栏
    bzoj1635 [Usaco2007 Jan]Tallest Cow 最高的牛
    bzoj1638 [Usaco2007 Mar]Cow Traffic 奶牛交通
    bzoj3407 [Usaco2009 Oct]Bessie's Weight Problem 贝茜的体重问题
    bzoj1631 [Usaco2007 Feb]Cow Party
    bzoj1632 [Usaco2007 Feb]Lilypad Pond
  • 原文地址:https://www.cnblogs.com/alexanderthegreat/p/6657892.html
Copyright © 2020-2023  润新知