noocyte のプログラミング研究室 〜プログラムは楽しげに走らねばならない♪〜

エンディアン変換/判別関数・マクロ集
(C/C++,(ほぼ?) 処理系・OS 非依存)

公開:2007/10/14(日)
最終更新:2011/10/18(火)


0.目次

  1. はじめに
  2. シフトを用いたエンディアン反転 (Big ⇔ Little)
    1. 関数
    2. マクロ
  3. バイト交換を用いたエンディアン反転 (Big ⇔ Little)
  4. バイトコピーを用いた任意エンディアン変換
  5. バイト列 ⇔ 無符号整数変換
  6. エンディアンの判定
    1. CPU のエンディアンの判定
    2. Memory Mapped I/O Device のエンディアンの判定
  7. CPU に対する最適化
    1. シフト方式の長所・短所
    2. シフト方式の長所・短所
    3. メモリアクセス速度 vs. シフト速度
  8. 余談
    1. NIXU エンディアン発見!
  9. 参考図書
  10. サイト内関連ページ
  11. 外部へのリンク
  12. 更新履歴

1.はじめに

改装中

「構造体のエンディアン」とか「共用体のエンディアン」とかを探しに来た人はこっち


2.シフトを用いたエンディアン反転 (Big ⇔ Little)

2.1 シフトを用いたエンディアン反転関数

改装中

2.2 シフトを用いたエンディアン反転マクロ

改装中


3.バイト交換を用いたエンディアン反転 (Big ⇔ Little)

改装中


4.バイトコピーを用いた任意エンディアン変換

気が向いたら書く.


5.バイト列 ⇔ 無符号整数変換

改装中

5.1 バイト列 ⇒ 無符号整数変換

改装中

5.2 無符号整数 ⇒ バイト列変換

改装中


6.エンディアンの判定

6.1 CPU のエンディアンの判定

気が向いたら書く.

旧版 (4バイト・エンディアン専用)

6.2 Memory Mapped I/O Device のエンディアンの判定

気が向いたら書く.

特定のメモリアドレス範囲にマップされたデバイスのエンディアン判定. デバイス (アドレス) が異なればエンディアンも異なる可能性がある. (実際にそういうデバイスを使ったことがあるわけではなく, 可能性として考えてみているだけ.)


7.CPU に対する最適化

書きかけです.

7.1 シフト方式の長所・短所

7.2 バイト交換/コピー方式の長所・短所

7.3 メモリアクセス速度 vs. シフト速度

メモリアクセスが遅い CPU の例

シフトが遅い CPU の例


8.余談

8.1 NIXU エンディアン発見!

FLV (Flash Video) ファイルのフォーマットを調べていたら, NIXU エンディアンが見つかったのでびっくり!  FLV Tag の中にタイムスタンプ (1ms 単位) のフィールドがあるのだが, どうやら最初3バイトで設計されて,後で4バイトに拡張されたらしい. これは次のような配置になっている.

// タイムスタンプ (ms 単位,3バイト整数,ビッグエンディアン)
uint8_t timestamp[3];

// 拡張部分 (timestamp の上位8ビットとなる.)
uint8_t timestampExtended;

これらを1つの4バイト整数としてみると, ビッグエンディアンを1バイト左ローテートした NIXU エンディアンとなっている!  まさかこういうエンディアンが実在するとは思わなかった. こうなると,もうどんなエンディアンが出てきても不思議ではない気がする.

2007/12/10(月)

9.参考図書

ハッカーのたのしみ―本物のプログラマはいかにして問題を解くか
ジュニア,ヘンリー・S. ウォーレン
エスアイビーアクセス
売り上げランキング: 27265
おすすめ度の平均: 5.0
5 ビットの楽しみ
5 たのしみ? たしなみ?
5 ちゃんと読むと得した気分になれます
5 最後の頑張りに効きます
5 Hackっていうのは、こういうコトさ

主に2進整数やビットパターンのさまざまな演算技法について解説している. 基本的には (特定のプログラミング言語に依存しない) 数学的な解説が中心だが,C言語によるサンプルコードも示している.

アラインメントやオフセットの計算に使える「2の冪乗の倍数への切り上げ/切り下げ」や, メモリブロックの管理に使える「次の2の冪乗への切り上げ/切り下げ」, (ビット/バイト) エンディアン変換や FFT (高速フーリエ変換) で使われるビットリバース (ビット逆順) などを含む「ビットやバイト単位の並べ替え」など.




省メモリプログラミング

楽天で買う

価格:4,410円(税込、送料別)

省メモリプログラミング―メモリ制限のあるシステムのためのソフトウェアパターン集 (Software patterns series)
ジェイムズ ノーブル チャールズ ウィアー
ピアソンエデュケーション
売り上げランキング: 80302
おすすめ度の平均: 5.0
5 メモリ制限のあるシステム
5 分類が上手い
5 組み込み向けのデザインパターンとしてはまともです。
5 すべての設計者・プログラマに必須

「省メモリ」とあるが,メモリ管理の高速化についても参考になる技法が解説されている. 時々「malloc 高速(化)」などで検索して来る人がいるが, malloc の速度をこれ以上大きく改善する余地はあまりないと思う (あるとしても非常に難しいだろう).その理由は,

それでもなお malloc の高速化それ自体を目指したい人には「(悲愴な顔で) 頑張ってください」としか言えないが, 「アプリケーションのメモリ管理を高速化したいから高速な malloc が欲しい」というのならあまりにも芸がなさすぎる. そういう人はこの本の「第5章 Memory Allocation:メモリ割当て」を読んで反省してください.(笑)

アプリを高速化したいなら,できるだけ malloc/free を呼び出す頻度を減らすこと. そのためには1回の malloc で確保した大きな領域 (メモリプール) に多数のオブジェクトを詰め込む必要がある (これは省メモリにもなる) が, どのオブジェクトを同じ領域に入れるべきかはオブジェクトの寿命 (extent),サイズ, アラインメントなどを考慮して決める必要がある. 特に,寿命を知っているのはアプリケーションだけだ.

ところで,省メモリが高速化につながる場合も多い.昔からメモリと速度のトレードオフ (高速でメモリを大量に使用するアルゴリズム (例えばテーブル参照) を使うか, それとも低速でメモリを少ししか使用しないアルゴリズムを使うか) がよく問題になるので,省メモリと高速化は両立しないと思い込んでいる人もいるだろう. しかし最近の CPU は命令実行速度に比べてメモリアクセス速度がはるかに遅いので, 無駄なメモリを削減したり,メモリ上のデータ配置を変える (同時期に頻繁に使用するデータをなるべく少数のキャッシュラインに集中させる) と高速化されることも多い. (1970年代以前の CPU は命令実行とメモリアクセスが同期していたので同程度の速度だった.)

さて,ここで問題.次のコードで大きな2次元配列 (例えば画像データ) をコピーする場合,(1) と (2) のどちらが速いか.またその理由を述べよ. (理由を書かなければ0点)

int src[M][N], dest[M][N];
unsigned i, j;

// (1)
for(i = 0;  i < M;  i++)
  for(j = 0;  j < N;  j++)
    dest[i][j] = src[i][j];

// (2)
for(j = 0;  j < N;  j++)
  for(i = 0;  i < M;  i++)
    dest[i][j] = src[i][j];



珠玉のプログラミング

楽天で買う

価格:3,570円(税込、送料別)

珠玉のプログラミング―本質を見抜いたアルゴリズムとデータ構造
ジョン ベントリー
ピアソンエデュケーション
売り上げランキング: 7857
おすすめ度の平均: 4.5
5 アルゴリズムについて勉強したい人には必読の本です
5 楽しく読めるプログラミングの本
5 「プログラミング」と言う作業を見つめなおすのに最適。「設計する」と言う概念がよく分からない初級プログラマにも
5 納得!アルゴリズムは重要
5 プログラマなら読むべき本



プログラミング作法

楽天で買う

価格:2,940円(税込、送料別)

プログラミング作法
プログラミング作法
posted with amazlet at 10.06.20
ブライアン カーニハン ロブ パイク
アスキー
売り上げランキング: 20088
おすすめ度の平均: 4.5
5 良著です。
5 入門書の次の次の次くらいに!
3 繰り返し読む必要あり
5 絶対にお勧めの本です
5 良いプログラマになりたいあなたに



BINARY HACKS

楽天で買う

価格:3,360円(税込、送料別)

Binary Hacks ―ハッカー秘伝のテクニック100選
高林 哲 鵜飼 文敏 佐藤 祐介 浜地 慎一郎 首藤 一幸
オライリー・ジャパン
売り上げランキング: 35295
おすすめ度の平均: 5.0
5 組み込み系の開発者は必携です
5 ハードコア?なソフトウエア
5 大工さんにおける電動工具の紹介本
5 当然教科書ではない。でも、とても参考になります。
5 バイナリアンの基本



ガベージコレクションのアルゴリズムと実装

楽天で買う

価格:3,360円(税込、送料別)

ガベージコレクションのアルゴリズムと実装
中村 成洋 相川 光
秀和システム
売り上げランキング: 4312
おすすめ度の平均: 3.5
2 擬似コードのバグは見て見ぬふり
5 GCの入門書として今のところ最強!



【送料無料】リンカ・ローダ実践開発テクニック

楽天で買う

価格:2,940円(税込、送料別)

著者サポートページ




Linkers & loaders

楽天で買う

価格:3,360円(税込、送料別)

Linkers & Loaders
Linkers & Loaders
posted with amazlet at 10.06.17
John R. Levine
オーム社
売り上げランキング: 139529
おすすめ度の平均: 3.0
4 プログラムが実行される仕組みが良く分かる
1 概要が書かれた本
1 ひどい訳
5 dllのしくみがわかる!
5 パッケージソフト開発者の必読書



実践デバッグ技法

楽天で買う

価格:2,940円(税込、送料別)

実践 デバッグ技法 ―GDB、DDD、Eclipseによるデバッギング
Norman Matloff Peter Salzman
オライリージャパン
売り上げランキング: 79214



デバッガの理論と実装 (ASCII SOFTWARE SCIENCE Language)
ジョナサン・B. ローゼンバーグ
アスキー
売り上げランキング: 295384
おすすめ度の平均: 5.0
5 デバッグできないとき
5 普通に読んでいくだけでも面白い
5 デバッカの理論には必読



【送料無料】いかにして問題をとくか第11版

楽天で買う
価格:1,575円(税込、送料別)

いかにして問題をとくか
G. ポリア
丸善
売り上げランキング: 41

10.サイト内関連ページ


11.外部へのリンク


12.更新履歴

このページの主な更新は Blog でお知らせします.

  1. 2007/10/13(土) 作成開始
  2. 2007/10/14(日)
  3. 2007/10/19(金) 「はじめに」に, ビッグ/リトル以外のエンディアンが (今でも) 実在する可能性について追記.
  4. 2007/11/03(土) Test_ReverseEndianByShift{U,UL,ULL}() および Test_REVERSE_ENDIAN() が,CHAR_BIT≠8 でも16進桁数を正しく計算するように修正.
  5. 2007/12/10(月) 余談NIXU エンディアン発見! を追加.
  6. 2008/01/14(月) エンディアン・コード (Endian Code) の定義を追記.
  7. 2008/01/16(水) 下記を追加.
  8. 2008/09/13(土) CPU に対する最適化に少し追記.
  9. 2008/12/06(土) エンディアン・コード関連を削除.


Copyright © 2007-2011 noocyte, All rights reserved.
E-mail: relipmoced (a) yahoo.co.jp
  (" (a) " を半角のアットマークに書き替えてください.)
リンクはご自由に.
「noocyte のプログラミング研究室」トップページに戻る.