1

私はこの一般的な解決策を見つけました:-

int a=10, b=20;    
a=a+b;
b=a-b;
a=a-b;

しかし、a=2147483647 が整数の最大値の場合、おそらく a=a+b は実現不可能です。

4

3 に答える 3

14

標準ライブラリを使用するのはどうですか?;)

std::swap(a,b);

XORing アルゴリズムを使用することもできますが、本当に必要になるまで使用しないでください。

理由はここでよく説明されています:-

最新の CPU アーキテクチャでは、XOR 手法は、一時変数を使用してスワッピングを行うよりもかなり遅くなります。その理由の 1 つは、最新の CPU が命令パイプラインを介して並列に命令を実行しようとしていることです。XOR 手法では、各操作への​​入力は前の操作の結果に依存するため、厳密に順番に実行する必要があります。効率が非常に重要な場合は、ターゲット アーキテクチャで XOR 手法と一時変数スワッピングの両方の速度をテストすることをお勧めします。

遅すぎますが、組み込み関数が必要かどうかについて言及していないため、このswap方法が最も簡単です。

ただし、次のように XOR メソッドを使用することもできます (パフォーマンスについては上記のリファレンスを確認してください)。

a ^= b;
b ^= a;
a ^= b;
于 2013-10-21T16:50:37.157 に答える
6

解決策は次のとおりです。

a ^= b;
b ^= a;
a ^= b;

これx ^ xは、x の任意の値に対して 0 に等しく、したがってx ^ y ^ x(任意の順序で) x と y の任意の値に対して y に等しいため機能します。ただし、一時的なものを使用するよりも高速になる可能性は低いです (レジスタの競合が多く、パイプライン機能のない CPU 用にプログラミングしている場合を除きます)。

于 2013-10-21T16:48:25.807 に答える
4

以下のようにXORを試してみてください。

a ^= b;
b ^= a;
a ^= b;
于 2013-10-21T16:48:47.333 に答える