Posted at

ビット演算 [6]:変数内の特定のビットを交換する

More than 5 years have passed since last update.

ビット演算 [6] では、排他的論理和(^)を用いて、異なる変数の同じ位置のビットを交換する方法を示したが、そのテクニックを使ってひとつの変数内の特定のビットを交換することも可能だ。

変数 x の交換したいビットを mask1, mask2 とし、それらが n ビット離れている場合(ただし mask1 >> n = mask2 とする)、反転マスクを以下のように計算することが出来る。


auto t = ((x >> n) ^ x) & mask2;

t |= t << n;


この反転マスクを用いると、以下の文で mask1, mask2 の部分を交換することができる。


x ^= t;


例えば、変数xの下位4bitと、そのすぐ上の4bitを交換したい場合は、以下のように記述する。


auto t = ((x >> 4) ^ x) & 0x0f;

t |= t << 4;

x ^= t;


もし、xの値が 0x123 であれば、上記を実行後は 0x132 となる。