ディレクトリ
為替(次善の)ビットごとの排他的論理和演算を完了するために使用されます
交換を完了するためにローカル変数temp(最適)
#include<iostream>
#include <stdio.h>
void swap1(int& a, int& b)
{
int temp = a;
a = b;
b = temp;
};
int main()
{
int x = 5, y = 8;
printf("x:%d, y:%d\n", x, y);
swap1(x, y);
printf("x:%d, y:%d\n", x, y);
system("pause");
return 0;
}
交換を完了します。
為替(次善の)ビットごとの排他的論理和演算を完了するために使用されます
XOR演算規則がある:ビット別に対応する、または多数のコンピューティングに関与する2つの場合、二つの値が各ビットと同じでない場合には、排他的論理和の結果が1です。同じ値のそれぞれの2ビットの2つの値場合、排他的論理和の結果が0です。その後、バイナリビットは、小数ビット出力に変換します。
A |
B |
a⊕b |
1 |
0 |
1 |
1 |
1 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
#include<iostream>
#include <stdio.h>
void swap3(int& a, int& b)
{
a ^= b;
b ^= a;
a ^= b;
};
int main()
{
int x = 5, y = 8;
printf("x:%d, y:%d\n", x, y);
swap3(x, y);
printf("x:%d, y:%d\n", x, y);
system("pause");
return 0;
}
交換を完了します。
それはそうでなければ結果は、連続操作は3回、B値を切り替えることができるように、1であり、同一の対応するビットの場合、結果は0であり、不思議な現象です。
(最悪の)交換を完了するために、加算と減算を使用します
#include<iostream>
#include <stdio.h>
void swap2(int& a, int& b)
{
a = a + b;
b = a - b;
a = a - b;
};
int main()
{
int x = 5, y = 8;
printf("x:%d, y:%d\n", x, y);
swap2(x, y);
printf("x:%d, y:%d\n", x, y);
system("pause");
return 0;
}
交換を完了します。
3つの方法の長所と短所をまとめたもの
交換を達成するために、加算および減算を使用するための3つの方法、上記では、データのオーバーフローの問題が発生し、これに比べて、次にビット単位の排他的または一時的な変数のセットと、より安全な方法を使用することが可能です。3つのメモリ書き込み動作の合計が必要後しかし、プレスビット単位の排他的論理和、データが2つのレジスタに読み出されるたびに、その後の演算で、その後、変数に結果のライトバック。、非効率、およびコードの非常に悪い可読性になりますが、最も重要なことは、あなたがコンパイラとGCCコンパイラを使用して、二つの方法の上に達成するためにC言語を使用している場合、あなたはGCC -S swap.c表示コマンドを使用することができ、ありますアセンブリコード、コード少ない一時変数法、追加の使用のライン数 のGCC コンパイラ、配列エラーを切り替えるとの排他的論理和演算。したがって、別の長い読み取りレジスタに変数の値として、一時的な変数の実施形態の使用、それぞれ割当て、次いでレジスタ変数からのライトバックは、二つのメモリ書き込み動作正面に向けられ、後部、および安全な比較しますそして、より効率的!