读书人

[挑战]还有比小弟我这个更短更好的swa

发布时间: 2012-08-31 12:55:03 作者: rapoo

[挑战]还有比我这个更短更好的swap方法吗

C# code
namespace test{    using System;    class Program    {        static void Main(string[] args)        {            int a, b;            a = 100;            b = 3;            b = a + 0 * (a = b);            Console.WriteLine(a + "," + b);        }    }}

今天突然想到的,在网上搜了半天没发现同样的,和其他的一些方法比了一下,我觉得我这个是最优的了,最起码从效率上毫无疑问是最优的,看IL就知道
C# code
//000011:             b = a + 0 * (a = b);  IL_0005:  ldloc.0  IL_0006:  ldloc.1  IL_0007:  stloc.0  IL_0008:  stloc.1

没有运算,只有赋值

反汇编也差不多,
Assembly code
            b = a + 0 * (a = b);0000002f  mov         eax,dword ptr [ebp-8] 00000032  mov         dword ptr [ebp-10h],eax 00000035  mov         eax,dword ptr [ebp-0Ch] 00000038  mov         dword ptr [ebp-8],eax 0000003b  mov         eax,dword ptr [ebp-10h] 0000003e  mov         dword ptr [ebp-0Ch],eax 


[解决办法]
确实很简单啊!
如果是我可能就多写了a=b,这一步赋值
[解决办法]
我觉得多加一个中间变量可读性会好一些
[解决办法]
强憾。
[解决办法]
不错。
[解决办法]
不错。
[解决办法]
这个我很早以前看过,
主要是依赖编译器的编译规则
[解决办法]
C# code
int a, b;a = 100;b = 3;a^=b;b^=a;a^=b;
[解决办法]
不错,但是可读性不太好。
[解决办法]
探讨
C# code

namespace test
{
using System;
class Program
{
static void Main(string[] args)
{
int a, b;
a = 100;
b = 3;
……

[解决办法]

[解决办法]
强人年年有。。不是数字就了。。
[解决办法]
你看的懂吗 别人看的懂吗
[解决办法]
mov eax,a
xchg eax,b
mov a,eax


[解决办法]
lz你把编译器优化关了再看看il?
[解决办法]
我只是过来看看,我不说话
[解决办法]
“b = a + 0 * (a = b);”这句话会因编译器而异的吧?
[解决办法]
我没看懂 你们在讨论什么呀?
[解决办法]
这个绝对不是高效,顶多算是短小。
[解决办法]
别停留在c的阶段了~~你要快的话,下面这个快~~~
C# code
 int newa, newb;            for (int i = 0; i < 10000000; i++)            {                newa = b;                newb = a;            } 


[解决办法]
不错!
[解决办法]

探讨

强人年年有。。不是数字就了。。

[解决办法]
不见得有那么好。
[解决办法]

[解决办法]
很无知的做法,不要自鸣得意,

读书人网 >.NET

热点推荐