开发中经常遇到两个控件visible转换的问题,早就想弄个算法,一行代码搞定,没时间研究。bool a,b;1: a = b = true;
2: a = true;   b = false;
3: a = false;  b = true;
4: a = b = false;//----在此添加一行语句//输出结果为1: a = b = true;
2: a = false;  b = true;
3: a = true;   b = false;
4: a = b = false;我想出的算法是
b = a ^ b ^ (a = b);已经测试通过,谁还有更优化或者更简单的算法?
网上只有两个int交换的算法,这个算不算原创?嗬嗬~

解决方案 »

  1.   


    是不是更优我不知道 但,下面这句应没问题  a = a ? (b ? a :!(b=a)) : (b ?!(b=a) : b);
      

  2.   

    1楼结果不对,两个True"交换"后都成False了
      

  3.   

    b   =   a   ^   b   ^   (a   =   b); 
    楼主这样写程序累不累,我觉得这没有讨论的必要,因为效率一点也不会提高,而且代码不直观。
      

  4.   

    [code=MSIL].method private hidebysig static void  Main(string[] args) cil managed
    {
      .entrypoint
      // 代码大小       14 (0xe)
      .maxstack  3
      .locals init ([0] bool a,
               [1] bool b)
      IL_0000:  nop
      IL_0001:  ldc.i4.1
      IL_0002:  stloc.0
      IL_0003:  ldc.i4.0
      IL_0004:  stloc.1
      IL_0005:  ldloc.0
      IL_0006:  ldloc.1
      IL_0007:  xor
      IL_0008:  ldloc.1
      IL_0009:  dup
      IL_000a:  stloc.0
      IL_000b:  xor
      IL_000c:  stloc.1
      IL_000d:  ret
    } // end of method Program::Main[/code]楼主,不好意思!刚才看了一下,你的这个算法的确提高效率了。
      

  5.   

    可惜不能直接写IL代码,要不4句就解决战斗了[code=MSIL]IL_0005:  ldloc.0
    IL_0006:  ldloc.1
    IL_000a:  stloc.0
    IL_000c:  stloc.1[/code]
      

  6.   

    我来个直观易懂的:
    b = a == b ? b : !(a = b);
      

  7.   

    if(a^b)b=!(a=b);
    在a==b时效率比三元和楼主的都高,在a!=b时效率比三元高,比楼主的低一点
      

  8.   

    可以用Emit发射IL代码。。呵呵 。。
      

  9.   

    9楼的方式最简单,并且可以用来任何类型的数据
    我的方法:
    bool a, b;
    //...
    b = Interlocked.Exchange<bool>(ref a, b);
      

  10.   

    a = b | (b = a) & false;如果代码执行的量级没有上万,那么0.0001毫秒和0.0010毫秒可以忽略如果不是必要,还是可读性为主:
    t = a;
    a = b;
    b = t;
      

  11.   

    我估摸着,楼主的目的只是为了交换的方便,既然如此,可以自己做个函数嘛,比如Exchange(A, B)。这样,既可以一句话搞定,又有相当程度的可维护性和可读性。至于代码运行效率,嗯,这方面我是几乎不懂的,但我认为,这种运行效率上的差异非巨大的运算次数是体现不出来的。
      

  12.   


    b = !(a = !a);
    测试代码:bool a = true, b = true;
    Console.WriteLine("a=" + a + ";b=" + b);
    b = !(a = !a);
    Console.WriteLine("a=" + a + ";b=" + b);
    b = !(a = !a);
    Console.WriteLine("a=" + a + ";b=" + b);
      

  13.   

    这两个相似
    a = b | (b = a) & false;
    a = b & (b = a) | true;看这个帖子气氛不错,就多再灌点水学过计算机原理的人都知道,任何程序最终都是需要编译成机器指令才能执行。
    可以说机器指令是计算机唯一能直接识别的语言。
    机器指令无疑是能使计算机运行效率达到极致的语言。
    不过,为什还会出现汇编、C、C++、Java、Delphi、C#...呢?
    因为编程更多的还是人与人之间的交流!越高级的语言学习、使用成本越低。
    Windows为什么得到普及?不是因为Windows最快、最稳定,而是因为Windows学习、使用成本相对最低。
    程序员不能把自己的思维限制到和电脑交互上,还得跟多地考虑一下人与人间交互。-------
    伴水_清洁工_
      

  14.   

    我认为作为一条语句而言,楼主的方案是最简的了.
    其实就是一个反复判断的过程:
    a != b :
    Y -> a=b -> b = !a  也就是b=!(a=b)
    N -> a=b -> b = a   也就是b=(a=b)
    其中很明显的,b的赋值对应(a=b)应该取!,也就是(a==b)的状态.
    用乘法表示即为b=(a==b)*(a=b),折算到程序中即为(a==b)==(a=b)可以看作(a*b)*(a=b)即a*b*(a=b)
    而^是==的反向运算,因此a*b*(a=b)的两个*运算完全可以写成a^b^(a=b)正好负负抵消PS.*等效为1*1而^等效为1*-1的逻辑
      

  15.   

    a = !b = a;
    没运行过, 随手写的
      

  16.   

    superwat
    真勤奋~ 第一次突破点什么吧!继续努力
      

  17.   

    [code=C#]a = !(b = a);code]
      

  18.   

    b ^= a ^ (a = b)最终答案。应大家的要求,明天结帖!谢谢大家了~