交換の異種または実現
1.概要
aとbの値を交換したい場合は、一時変数tempを宣言してから交換を実現するのが一般的です.
そうすべきだったが、今日「コンピュータシステムを深く理解する」という本を読んだとき、3番目の位置が来たときに記憶する必要がなく、もう一つの巧みな実現方法を発見した.
ビット操作(異或)だけでいいです.
2.異或
定義:
a^b=a'b+ab'(a'は非a)
1^1 = 0;
0^0 = 0;
1^0 = 1;
0^1 = 1;
ルール:
a ^ a = 0;
a ^ 0 = a;
a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;
推論:
(a^b)^b = a^(b^b) = a;
3. code
4.結論
性能的には大きな優位性はありませんが、この方法は考えを広げましたが、柳暗花明又一村の感じを与えてくれました.
aとbの値を交換したい場合は、一時変数tempを宣言してから交換を実現するのが一般的です.
そうすべきだったが、今日「コンピュータシステムを深く理解する」という本を読んだとき、3番目の位置が来たときに記憶する必要がなく、もう一つの巧みな実現方法を発見した.
ビット操作(異或)だけでいいです.
2.異或
定義:
a^b=a'b+ab'(a'は非a)
1^1 = 0;
0^0 = 0;
1^0 = 1;
0^1 = 1;
ルール:
a ^ a = 0;
a ^ 0 = a;
a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;
推論:
(a^b)^b = a^(b^b) = a;
3. code
// C
void swap(int *x, int *y)
{
*x = *x ^ *y;
*y = *x ^ *y;
*x = *x ^ *y;
}
4.結論
性能的には大きな優位性はありませんが、この方法は考えを広げましたが、柳暗花明又一村の感じを与えてくれました.