交换整数效率

时间:2012-06-05 03:13:30

标签: algorithm swap

简单地说,

X = Integer
Y = Another Integer

Z ( If used ,Integer Temp )

什么是最有效的方法?

方法I:

Z = X
X = Y
Y = Z

方法II:

X ^= Y
Y ^= X
X ^= Y

编辑我 [装配视图]

方法I:

MOV  
MOV  
MOV

方法II:

TEST ( AND )  
JZ  
XOR  
XOR  
XOR

注意:

  • MOVXOR
  • TESTJZ用于XOR Equality Safe
  • `方法我使用额外的寄存器

2 个答案:

答案 0 :(得分:3)

在大多数情况下,使用临时变量(通常是程序集级别的寄存器)是最佳选择,也是编译器倾向于生成的选项。

  

在大多数实际场景中,使用一个简单的交换算法   临时注册更有效率。 XOR的有限情况   交换可能是实际的包括:在处理器上的   指令集编码允许XOR交换在a中编码   较少的字节数;在一个具有高套准压力的地区,它   可以允许寄存器分配器避免溢出寄存器。在   可用RAM的微控制器非常有限。因为这些   情况很少见,大多数优化编译器都不会产生异或   交换代码。

http://en.wikipedia.org/wiki/XOR_swap_algorithm

此外,如果将相同的变量作为两个参数传递,则XOR Swap实现将失败。正确的实现(来自同一链接)将是:

void xorSwap (int *x, int *y) {
     if (x != y) {
         *x ^= *y;
         *y ^= *x;
         *x ^= *y;
     }
 }
  

请注意,代码不会交换立即传递的整数,但是   首先检查他们的地址是否不同。这是因为,如果   地址相等,算法将折叠为三倍* x ^ = * x   结果为零。

答案 1 :(得分:0)

尝试这种交换数字的方式

int a,b;

A = A + B-(B = A);