+=
2 つの変数をand-=
演算子のみで、一時変数なしで交換したいと考えています。次のような標準的なソリューションを知っています。
a = a+b;
b = a-b;
a = a-b;
とxor
:
a ^= b;
b ^= a;
a ^= b;
+=
しかし、 と だけでそれを行う方法がわかりません-=
。出来ますか?
私のクラスメートは素晴らしい解決策を提供しています: 答えはNO
a
as(1 0)
とb
asを表しましょう(0 1)
行列A
は
1 0
0 1
+=
-=
行を互いに追加または削除することを意味します。これは、行列式が符号を変えないか、 に等しいことを意味し0
ます。終了行列は
0 1
1 0
行列式が に等しいため-1
、取得できません
更新:これらの操作があります:
a-=a
. 1行になります0
ので、det=0
a+=a
. これは、行に を掛けることを意味する2
ので、det A'= 2*det A
a+=b
. それは基本的な変換を意味し、値を変更しませんdet
a-=b
. と同じこと3.
次に、この証明をb-=b
、b+=b
、b+=a
、 に適用しますb-=a
。したがって、行列式はその符号を変更しないか、0
更新 2: @Tom が言ったように、C# でそれを行う方法の例は次のとおりです: http://ideone.com/UzVLML。ただし、C では正しくありません: http://codepad.org/Rmhn9iqb。b -= b += b
誰かが C と C#の違いを明確にできますか ?
OP はそれが不可能であることを証明しましたが、現代の言語ではごまかすことができます。
a += b;
b -= b += b; // Negates b in most languages, but not in C
b += a;
a -= b;
a +=b;
b -=a;
b =-b;
a -=b;