«前の日記(2007年09月18日) 最新 次の日記(2007年09月20日)» 編集

日々をアレコレ


2007年09月19日

エンディアン変換

複数のチップを使う処理系の場合、エンディアンの変換が必要になったりする。これまでは共用体を使っていた。

/* 変換元データ */
long lData;
/* 変換共用体 */
union UNI_CHANGE_TABLE{
    long data;
    char change[4];
} uniChangeTable;
/* 変換先バッファ */
char cBuf[4];

uniChangeTable.data = (変換するデータ);
cBuf[0] = uniChangeTable.change[3];
cBuf[1] = uniChangeTable.change[2];
cBuf[2] = uniChangeTable.change[1];
cBuf[3] = uniChangeTable.change[0];

でも、これだと最適化のやりかたによっては命令数が増えたりするようだ。これは組み込み系では重大なので、ビット演算を使うのが正しいようだ。

/* 変換元データ */
long lData;
/* 変換先バッファ */
char cBuf[4];

cBuf[0] = ( lData >> 24 ) & 0xFF;
cBuf[1] = ( lData >> 16 ) & 0xFF;
cBuf[2] = ( lData >> 8 ) & 0xFF;
cBuf[3] = lData & 0xFF;

ニセ科学でないという証明をすればよい

お茶の水大、「ニセ科学批判」がらみで提訴される(/.J)より。非科学者相手に論理的な話をしても仕方ないのかもしれないけど。そもそも、「ニセ科学」という言葉は決して批判ではなく、科学論理的思考の末に生まれた結論。もし、科学的に正しいという主張をするのであれば、そのことを批判するのではなく、科学論理的に導き出せばよい。自分の商売を邪魔になるからって単に批判しているようじゃ科学者とは言い難い。

Tags: news science
本日のツッコミ(全4件) [ツッコミを入れる]
李徴 (2007年09月20日 01:08)

あれ? signedでも大丈夫なの? (VCでもgccでも大丈夫でしたが) lData = 0x000000FF = +255 のとき、lData & 0xFF = 0x000000FF = +255 となり、charの扱える範囲外なのに cBuf[3] に代入したら cBuf[3] = 0xFF になってる。+255 は -1 にキャストされるの?

李徴 (2007年09月20日 01:29)

大きい型への変換は符号拡張なのに、小さい型への変換は単純にビット切り出しですか?

李徴 (2007年09月20日 01:47)

処理系依存らしいですね。でもTurboCでもHEWでもVCでもgccでも単純に下位バイト切り出しです。それがデファクトなんでしょうか。(連続投稿失礼。)

さくらだ (2007年09月20日 23:29)

ビット操作してるだけなので、符号有り無しは無関係なのでは?<br><br>charをくっつけてlongにするときはキャスト必須ですが、逆は結局入るだけのビットしか入らないので、そもそも & 0xffすら要らないという話のような。<br><br>どちらも根拠レスですが(^^;


«前の日記(2007年09月18日) 最新 次の日記(2007年09月20日)» 編集