エンディアンについて
(0) 予備知識
(1) エンディアン
- たとえば 0x12345678 という32bitを8bit(=1バイト)ずつに分けて格納したい場合がある。このときに 12 34 56 78 という順序になるのがビッグエンディアンであって、 78 56 34 12 の順になるのがリトルエンディアンである。
- 上記のwikipediaでは、ビッグエンディアンは人間の表記順序に近いというメリットが挙げられているし、リトルエンディアンは多倍長計算の際にアドレスを順方向にたどっていけるのがメリットであるとされている(加算、減算、乗算では確かにそのとおりである・・・人間の筆算でも下の桁から計算していきますよね)。
- もしこれだけの観点しか存在しないのだとしたら、僕はリトルエンディアンのほうが良いと考える。なぜなら人間の慣習なんて合理的な理由ではないから。なんとなれば、人間のほうが数字を逆に書くようになればいいんだ、とさえ思う。
(2) 別の観点
- ここでは以上の常識的な観点以外の視点から、エンディアンについて考えてみようと思う。
- 16進数で書くと分かりにくくなるかもしれないので、以後は2進数で考えてみる。abcdefghijklmnop という16bitのビット列があったとしよう。これを8bitずつビッグエンディアンで書くと abcdefgh ijklmnop になる。逆にリトルエンディアンで書くと ijklmnop abcdefgh になる。実際に適当な2進数を当てはめてみれば分かると思う。
- エンディアンというのは、何も8bitずつ区切ったときにだけ定義されるものではない。4bitずつに切り分ける場合でも適用されるはずだ。ビッグエンディアンなら abcd efgh ijkl mnop になるし、リトルエンディアンなら mnop ijkl efgh abcd になる。
- これをもっと押し進めると、1bitずつに区切った場合というのも定義できると思う。ビッグエンディアンなら a b c ... n o p だし、リトルエンディアンなら p o n ... c b a だ。
- したがって、 abcdefgh ijklmnop という2バイトを1bitのシリアル通信で送り出すとしたら、a b c d e f g h i j k l ... か h g f e d c b a p o n m ... という順序こそが自然だということになる。そしてもしあなたがかつての僕のようにリトルエンディアンこそ合理的ですばらしいと信じる人であれば、h g f e d ... という順序でビットストリームを考えるべきといえるだろう。ビットストリームでも数bitのヘッダをつける場合があるが、たとえば、1 1 0 というヘッダは、8bitデータ中では xxxxx011 となって現われるわけである。
- かつての僕はリトルエンディアンが好きで何でもリトルエンディアンに統一しようとしていたのに、ビットストリーム内の 1 1 0 というヘッダが 110xxxxx としてバイト内に現れるようにプログラムしていたことがあった。つまり当時の僕は全然分かっていなかったということになる。
こめんと欄