• 不用中间变量,交换a、b值


    如果要交换a、b之间的值,一般的做法是:

    tmp=a;a=b;b=tmp;这种方法不得不使用一个临时变量。

    从网上学来一个方法,可以不用使用临时变量:

    a^=b^=a^=b;

    这样计算之后,就可以交换a、b值


    证明:

    首先:^ 是 位运算 的一种: 异或 运算

    1^1=0;

    0^0=0;

    1^0=1;

    0^1=1;

    将a、b用二进制表示为:

    a=An-1 An-2……A1 A0

    b=Bn-1 Bn-2……B1 B0

    由于a与b进行位运算,是各个bit位分别进行运算,互不影响,下面对某一个位值i上的运算进行分析;

    设Ai和Bi是a、b二进制位上的数值,0或1。

    四种情况:

    当Ai=1;Bi=1;时:

    Ai^=Bi;后:Ai=0;

    Bi^=Ai;后:Bi=1;

    Ai^=Bi;后:Ai=1;

    当Ai=1;Bi=0;时:

    Ai^=Bi;后:Ai=1;

    Bi^=Ai;后:Bi=1;

    Ai^=Bi;后:Ai=0;

    当Ai=0;Bi=1;时:

    Ai^=Bi;后:Ai=1;

    Bi^=Ai;后:Bi=0;

    Ai^=Bi;后:Ai=1;

    当Ai=0;Bi=0;时:

    Ai^=Bi;后:Ai=0;

    Bi^=Ai;后:Bi=0;

    Ai^=Bi;后:Ai=0;

    也就是说,对于a、b的每个bit位上的值,进行三次异或赋值运算之后,都会被交换,那么a、b值也就交换了。

    传统的tmp=a;a=b;b=tmp;方法也是进行三次赋值运算,但是异或(^)作为位运算,效率更高,而且避免了中间变量的使用。

    但是位运算只能在整型数值之间进行,这是此方法的局限性。

     1 namespace ConsoleApplication1
     2 {
     3     class Program
     4     {
     5         static void Main(string[] args)
     6         {
     7            int a = 10;
     8            int b = 20;
     9            a ^= b;
    10            b ^= a;
    11            a ^= b;
    12            Console.WriteLine("a={0}", a);
    13            Console.WriteLine("b={0}", b);
    14            Console.ReadKey();
    15         }
    16     }
    17 }
    18 19 /*Out: 20 a = 20 21 b = 10
    */

    对于int型变量最简单的方式是:
    int a,b;
    a = b – a + (b = a) ;

  • 相关阅读:
    Memcached下载、安装及使用演示。
    Redis和Memcache对比及选择
    Log4Net.Config配置信息《转》
    常用正则表达式!收藏
    关于ViewData,ViewBag,TempData三者学习记录!
    C#实战Microsoft Messaging Queue(MSMQ)消息队列(干货)<转>
    C# AutoResetEvent
    C#英文面试常见问题[转]
    Highsoft.Highcharts 5.0.6439.38401 key
    vs2017安装后自动应用许可证
  • 原文地址:https://www.cnblogs.com/zcwvictor-2012/p/3737148.html
Copyright © 2020-2023  润新知