int a,b; a=10; b=15;int t; t=a; a=b; b=t;
このアルゴリズムは理解しやすく、初心者がコンピュータ プログラムの特性を理解するのに特に適しています。代入ステートメントの古典的な応用です。実際のソフトウェア開発では、このアルゴリズムは単純明快で曖昧さがなく、プログラマ間のコミュニケーションが容易であり、変数値の交換の問題が発生した場合には、通常、このアルゴリズム (以下、標準アルゴリズムと呼びます) を使用する必要があります。
int a,b; a=10;b=12; a=b-a; //a=2;b=12b=b-a; //a=2;b=10a=b+a; //a=10;b=10
原理は、aとbを数値軸上の点として扱い、2点間の距離を中心に計算します。
int *a,*b; //假设*a=new int(10);*b=new int(20); //&a=0x00001000h,&b=0x00001200ha=(int*)(b-a); //&a=0x00000200h,&b=0x00001200hb=(int*)(b-a); //&a=0x00000200h,&b=0x00001000ha=(int*)(b+int(a)); //&a=0x00001200h,&b=0x00001000h
上記の操作により、実際に a と b のアドレスが交換され、a は元々 b が指した値を指し、b は元々 a が指した値を指すのでしょうか?上記のコードはコンパイルできますが、実行結果は驚くべきものです。なぜ?
if(a<b) { a=(int*)(b-a); b=(int*)(b-(int(a)&0x0000ffff)); a=(int*)(b+(int(a)&0x0000ffff)); }else{ b=(int*)(a-b); a=(int*)(a-(int(b)&0x0000ffff)); b=(int*)(a+(int(b)&0x0000ffff)); }
アルゴリズムの最大の改良点は、アドレスの上位 16 ビットがセグメント アドレスであり、アドレスの上位 16 ビットがセグメント アドレスであり、アドレスの上位 16 ビットがセグメント アドレスであり、アドレスの上位 16 ビットがセグメント アドレスであり、アドレスの上位 16 ビットがセグメント アドレスであり、最後の 16 ビットであるため、ビット演算で AND 演算「int(a)&0x0000ffff」を使用することです。 16 ビットはディスプレースメント アドレスです。0x0000ffff との AND 演算の後、セグメント アドレスはマスクされ、ディスプレースメント アドレスのみが保持されます。これは元のアルゴリズムと一致し、正しい結果が得られます。
このアルゴリズムも、算術アルゴリズムと比較すると、3番目の変数を使用せずに値の交換を完了しますが、大きなデータ型を交換する場合、その実行速度が算術アルゴリズムよりも速いという利点があります。アドレスは交換しますが、変数値はメモリ内に移動されていないためです。 (以下、アドレスアルゴリズムと呼びます)int a=10,b=12; //a=1010^b=1100;a=a^b; //a=0110^b=1100;b=a^b; //a=0110^b=1010;a=a^b; //a=1100=12;b=1010;
このアルゴリズムの実装は、XOR 演算を通じてデータ内の一部のビットを反転することができます。他のビットは変更されません。これは、任意の数値と任意の値が連続 2 回 XOR 演算され、値は変更されないことを意味します。
int exchange(int x,int y) { stack S; push(S,x); push(S,y); x=pop(S); y=pop(S); }
上記のアルゴリズムはすべて、他の変数の助けを借りずに 2 つの変数値の交換を実現します。それに比べて、算術アルゴリズムとビット演算は同じ量の計算を必要とします。アドレス アルゴリズムの計算はより複雑です。ただし、最初の 2 つは整数データのみを交換できるのに対し、大規模な計算 (カスタム クラスや構造体など) を簡単に実現できます (理論上、「^」演算子をオーバーロードすると、任意の構造体の交換も実現できます)。 )。
以上が3 番目の変数を使用せずに 2 つの変数の値を交換する 4 つの方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。