1

简单地,

X = Integer
Y = Another Integer

Z ( If used ,Integer Temp )

最有效的方法是什么?

方法一:

Z = X
X = Y
Y = Z

方法二:

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

编辑我 [装配视图]

方法一:

MOV  
MOV  
MOV

方法二:

TEST ( AND )  
JZ  
XOR  
XOR  
XOR

备注:

  • MOV那么慢XOR
  • TEST,JZ用于XOR平等安全
  • `方法我使用额外的寄存器
4

2 回答 2

3

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

在大多数实际场景中,使用临时寄存器的普通交换算法效率更高。XOR 交换可能可行的有限情况包括: 在指令集编码允许 XOR 交换以较少字节数编码的处理器上;在具有高寄存器压力的区域中,它可以允许寄存器分配器避免溢出寄存器。在可用 RAM 非常有限的微控制器中。因为这些情况很少见,所以大多数优化编译器不会生成 XOR 交换代码。

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 导致零。

于 2012-06-05T03:16:53.420 回答
0

试试这种交换号码的方法

整数a,b;

a=a+b-(b=a);

于 2012-06-06T17:57:34.927 回答