开发中经常遇到两个控件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交换的算法,这个算不算原创?嗬嗬~
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交换的算法,这个算不算原创?嗬嗬~
是不是更优我不知道 但,下面这句应没问题 a = a ? (b ? a :!(b=a)) : (b ?!(b=a) : b);
楼主这样写程序累不累,我觉得这没有讨论的必要,因为效率一点也不会提高,而且代码不直观。
{
.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]楼主,不好意思!刚才看了一下,你的这个算法的确提高效率了。
IL_0006: ldloc.1
IL_000a: stloc.0
IL_000c: stloc.1[/code]
b = a == b ? b : !(a = b);
在a==b时效率比三元和楼主的都高,在a!=b时效率比三元高,比楼主的低一点
我的方法:
bool a, b;
//...
b = Interlocked.Exchange<bool>(ref a, b);
t = a;
a = b;
b = t;
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);
a = b | (b = a) & false;
a = b & (b = a) | true;看这个帖子气氛不错,就多再灌点水学过计算机原理的人都知道,任何程序最终都是需要编译成机器指令才能执行。
可以说机器指令是计算机唯一能直接识别的语言。
机器指令无疑是能使计算机运行效率达到极致的语言。
不过,为什还会出现汇编、C、C++、Java、Delphi、C#...呢?
因为编程更多的还是人与人之间的交流!越高级的语言学习、使用成本越低。
Windows为什么得到普及?不是因为Windows最快、最稳定,而是因为Windows学习、使用成本相对最低。
程序员不能把自己的思维限制到和电脑交互上,还得跟多地考虑一下人与人间交互。-------
伴水_清洁工_
其实就是一个反复判断的过程:
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的逻辑
没运行过, 随手写的
真勤奋~ 第一次突破点什么吧!继续努力