ビットセットをどう図示するか

[n/8]番目のバイトのn%8ビット目を立てることによって整数nを表すビットセット型のオブジェクトがあったとする。例えば、そのオブジェクトでは、{2, 3, 5, 7, 11, 13}というような整数の集合は、{0xbc, 0x28}というchar型の配列で表現される。
さて、そのようなオブジェクトをどのように図示すればよいか? 理論上以下の4通りが考えられるだろう。以下、「■」は1のビットを、「□」は0のビットを表すものとする。

1. 各バイトを昇順に、バイト内の各ビットは降順に並べる。

  7 6 5 4 3 2 1 0 151413121110 9 8
 ■□■□■■□□ □□■□■□□□
     byte [0]         byte [1]

char型の配列をプログラミング言語的に最も素直に書くとこうなる。また、シフト演算子の向きが図でのビットの並びの位置に一致する。しかし、各ビットに対応する整数の並びがバイト境界で不連続になってしまう。

2. 各バイトを昇順に、バイト内の各ビットも昇順に並べる。

  0 1 2 3 4 5 6 7  8 9101112131415
 □□■■□■□■ □□□■□■□□
     byte [0]         byte [1]

バイトの順番を保存し、かつ対応する数値の順序を連続にしようとするとこうなるが、シフト演算子の向きとビットの並びの向きとが逆になるのが難点。

3. 各バイトを降順に、バイト内の各ビットも降順に並べる。

 151413121110 9 8  7 6 5 4 3 2 1 0 
 □□■□■□□□ ■□■□■■□□ 
     byte [1]         byte [0]

ビットセットを一つの巨大な2進整数と考えるならばこのような図示方法が最も合理的である。しかし、バイト順がひっくり返るのが、ややもすると分かりづらいかもしれない。

4. 各バイトを降順に、バイト内の各ビットは昇順に並べる。

  8 9101112131415  0 1 2 3 4 5 6 7
 □□□■□■□□ □□■■□■□■
     byte [1]         byte [0]

おそらくこれが 4種類の組み合わせのなかで最もひねくれた並べ方だろうし、こんなことをする奴はまずいないと思う。
#なんか表示がずれるなあ……。


なんだって僕はこんなややこしい話をしているのかというと、今日、1.の図を思い浮かべている人と2.の図を思い浮かべている人とが、考え方の相違に気づかないまま、互いに「左」とか「右」とか言い合って全然話が噛み合っていなかったところを目撃してしまったからだ。あなたは上のなかでどれが最も「自然な」図示だと思うだろうか?