ビットの組み合わせを活性化

32bitのレジスタに対して、そのうち任意の2bitが {01, 10} となる組み合わせを網羅するにはどういうデータを使えばよいのだろう?

0x55555555, 0xAAAAAAAA の4つだと、

偶数bitと奇数bitの間では{01, 10}の組み合わせが成立する。

ところが偶数bit同士・奇数bit同士で見ると {00, 11} しかない。


答えは意外とシンプルで下記の10個のデータを入れればよいようだ

  1. 0x55555555, 0xAAAAAAAA
  2. 0x33333333, 0xCCCCCCCC
  3. 0x0F0F0F0F, 0xF0F0F0F0
  4. 0x00FF00FF, 0xFF00FF00
  5. 0x0000FFFF, 0xFFFF0000

5.では上位16bitと下位16bitでグループが分かれている。

同じ16bitのグループに着目すると、4.で8bitのグループに分かれる。

そこでも同じ8bitのグループに着目すると3.で4bitのグループに分かれる。

そこでも同じ4bitのグループに着目すると2.で2bitのグループに分かれる。

1.では隣のbitとは異なるグループなので、5パターンやれば全員と違うグループになれた。


あるいは1bitずつデータを変化させればいいわけだけど。

1bitあたり2パターンが必要になるので、32bitだと64パターンはいる。

ただ、動かすべきビット数が少なければこっちの方がシンプルかもしれない。

見ての通り上記の10パターンというのは 32=25 という関係性から来ている。

ビット幅が狭くなるほど、この差は小さくなっていくので、

8bit幅だと上記のようなパターンを使っても1~3の6パターンは必要で、

1bitずつ動かした場合に必要な8パターンとさほど変わらないという話はある。


1bitずつ動かすというアイデアの方が最初に思いついて、

でもさすがに32bitに対して適用すると割に合わないなと思ったので、

いろいろ考えたら、そういうことかとなったという話だった。

これが役に立つのかはよくわからないが、そういうデータを使うのもいいかもなと思ったのだった。