1

単に、

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 [アセンブリビュー]

方法I:

MOV  
MOV  
MOV

方法II:

TEST ( AND )  
JZ  
XOR  
XOR  
XOR

ノート :

  • MOV遅いですXOR
  • TEST、EqualitySafeJZに使用されますXOR
  • `方法Iは追加のレジスタを使用します
4

2 に答える 2

3

ほとんどの場合、一時変数(通常はアセンブリレベルのレジスタ)を使用するのが最良の選択であり、コンパイラが生成する傾向があります。

ほとんどの実際的なシナリオでは、一時レジスタを使用する簡単なスワップアルゴリズムの方が効率的です。XORスワッピングが実用的である可能性のある限られた状況には、次のものがあります。命令セットのエンコードによってXORスワップをより少ないバイト数でエンコードできるプロセッサ。レジスタ圧力が高い領域では、レジスタアロケータがレジスタをこぼさないようにすることができます。利用可能なRAMが非常に限られているマイクロコントローラ。これらの状況はまれであるため、ほとんどの最適化コンパイラはXORスワップコードを生成しません。

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

また、同じ変数が両方の引数として渡された場合、XORスワップの実装は失敗します。(同じリンクからの)正しい実装は次のようになります。

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

コードはすぐに渡された整数を交換しませんが、最初にそれらのアドレスが異なるかどうかをチェックすることに注意してください。これは、アドレスが等しい場合、アルゴリズムがトリプル* x ^ = * xにフォールドされ、結果がゼロになるためです。

于 2012-06-05T03:16:53.420 に答える