web-dev-qa-db-ja.com

新しい値を作成せずに変数値を交換する

最近、追加の変数を作成せずに変数値を交換するように求められる質問に直面しました。

つまり、A = 10、B = 20です。20をAに、10をBに保存するにはどうすればよいですか。

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

A = A + B     #new value of A=30
B = B + A     #new value of B=50
A = B - A     #new value of A=20
B = B - 2 * A #new value of B=10

したがって、A = 20およびB = 10

このアルゴリズムには既知の名前がありますか?

4
dellasavia

これは XORスワップアルゴリズム の長くて効率の悪いバリアントです。ここでは、最も一般的に知られている解決策をwikiから繰り返し説明します。

# solution 1
A = A + B
B = A - B
A = A - B

# solution 2 (^ is XOR)
A = A ^ B
B = B ^ A
A = A ^ B

@PEMapModder

最後の2行目では、A^BB^Aの間に違いはありませんか?なぜそれらを交換するのですか?

それらの間に違いはありません。私は Wiki が歴史的な理由でそれらを交換すると思います:バイナリ演算に2つのレジスタを使用する機械語命令(バイナリ演算に3つのレジスタを使用するMIPSとは異なり、ソースとターゲット/宛先)の場合、XORソリューションは次のとおりです。

XOR A B       # A = A ^ B
XOR B A       # B = B ^ A
XOR A B       # A = A ^ B
12
mostruash