ビット演算>xor(排他的論理和)を用いたビットの交換

前稿 で、and, or を用いたビット交換方法を示したが、xor を用いると、より簡潔に書けるぞ。

int x = 何らかの値;
int y = 何らかの値;
const int t = (x ^ y) & 0xf;   //  x と y の下位8ビットの xor
x ^= t;    //  下位8ビットが x^(x^y) = y になる
y ^= t;    //  下位8ビットが y^(x^y) = x になる

どうだろう?ご理解いただけるであろうか?
前稿の方法と比べて、非常に簡潔になったでしょ。

交換したい部分の xor(排他的論理和)をとり、それを元の変数に xor することで、ビットを交換できるということだ。

筆者がはじめてこのテクニックを見たときはかなりびっくりした。言われてみればあたりまえなのだが、ビットを交換するときに方法が思いつかず、前稿の方法を使っていたからだ。

演習問題:

  1. 上記コードをビルド・デバッガで実行し、正しく交換されることを確認しなさい。