用按位異或運算符交換兩個數,不引入第三個變量
void swap(int &a , int &b)
{
a = a^b;
b = a^b;
a = a^b;
}
解這個函數,只需要知道抑或運算的一些特性:
1. 異或運算滿足結合律、交換律
2. 按位異或的3個特點:
(1) 0^0=0,0^1=1 0異或任何數=任何數
(2) 1^0=1,1^1=0 1異或任何數=任何數取反
(3) 任何數異或自己=把自己置0
上面的代碼可以這樣展開理解:
// 設 a =A, b = B , 交換要達到的目標爲, a = B, b = A
a = a^b; // a = A ^ B
b = a^b; // 相當於 b = A ^ B ^ B; ==> b = A ^ 0; // by特點3,性質1 ==> b = A; // by特點1 // 現在 b變量持有原a變量的值A。
a = a^b; // 相當於 a = A ^ B ^ A; ==> a = B ^ 0; // by特點3,性質1 ==> a = B; // by 特點1 // 現在 a變量持有原b變量的值B。