排他的OR、また二 - C / C ++プログラムベースのスイッチング値の数の減算ビット単位ローカル変数、(VI)

ディレクトリ

 

交換を完了するためにローカル変数temp(最適)

為替(次善の)ビットごとの排他的論理和演算を完了するために使用されます

(最悪の)交換を完了するために、加算と減算を使用します

3つの方法の長所と短所をまとめたもの


交換を完了するためにローカル変数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  コンパイラ、配列エラーを切り替えるとの排他的論理和演算。したがって、別の長い読み取りレジスタに変数の値として、一時的な変数の実施形態の使用、それぞれ割当て、次いでレジスタ変数からのライトバックは、二つのメモリ書き込み動作正面に向けられ、後部、および安全な比較しますそして、より効率的!

公開された271元の記事 ウォンの賞賛8 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_17846375/article/details/104893382