• ベストアンサー

バイナリーで出てくるデータの変更

計測器からバイナリーで出てくるデータを直し保存したいのですが char data1[2048] 計測器からデータを読み込み data1に入れるプログラム printf("Data read: %s\n", data1); とやると、バイナリデータのため文字化けしてしまいます。 このバイナリデータを呼び出して以下のように変更したいです。 ・11bits 4kWords 11111111111で正の最大値、 10000000000で0、 01111111111で負の最大値(一番左が符号ビット)となるバイナリデータを 01111111111で正の最大値、 00000000000で0、 11111111111で負の最大値と変更する 中心の数1024よりも大きい場合は中心の数を引き、 小さい場合には補数を取るためにー1.0を掛ければいいと思うのですが それをC言語でどのようにやればいいのかわかりません。 C言語にあまり詳しくないのですが、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

すみません。やってて気がついたんですが、 最上位ビットが立っている > 10000000000で0、 で、 > -1は00000000001 > -2は00000000010だと考えています。 > (一番左の0がマイナスの符号ビットになっている) > (+1は10000000001) とすると、ビットが全部寝ている '0' はどういうあつかいなんでしょうか? その辺をスルーしてやってみるとこんな感じでしょうか? #include <stdio.h> unsigned int tbl[] = { 0x7ff, /* */ 0x7fe, /* */ 0x401, /* 1 */ 0x400, /* 0 */ 0x0, /* ??? */ 0x1, /* -1 */ 0x2, /* -2 */ 0x3fe, /* */ 0x3ff, /* */ }; int main() { const unsigned int mask = ~(~0 << 11); const unsigned int msb = 1 << 10; int i; for (i=0; i < sizeof tbl / sizeof tbl[0]; i++) { printf("%04x => %d\n", tbl[i], ( ((tbl[i] & mask) == msb) ? 0 :(tbl[i] & msb) ? (tbl[i] & ~msb) :(-tbl[i])) ); } return 0; } 実行結果: 07ff => 1023 07fe => 1022 0401 => 1 0400 => 0 0000 => 0 0001 => -1 0002 => -2 03fe => -1022 03ff => -1023

eakm26
質問者

お礼

確かに、0400が0だと考えると0000が不明ですね。 装置の取扱説明書を見たのですがそこまで詳しく書いていないのでわかりませんでした。 なるほど、このようにすれば結果が出ますね。 条件演算子は使い慣れていなかったので、勉強になりました。 0になる所などは何度か変えて試してみたいと思います。 回答していただき本当にありがとうございました。

その他の回答 (2)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

if ( ( c & 0x3ff ) == 0x400 ) {   // 正またはゼロ   c &= 0x3ff; } else {   // 負   c |= 0x400; } ってことでしょうか …

eakm26
質問者

お礼

返信が遅れてしまい大変申し訳ありませんでした。 c&0x3ffはcの第11ビットを0にするだけなので =0x400にはならないと思うのですが違うのでしょうか。 ただ、どのようにやればよいか大変参考になりました。 本当にありがとうございます。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

下駄ばき(バイアス)表現かと思ったら微妙に違いますね。 ・11bits 4kWords 11111111111で正の最大値、 10000000000で0、 01111111111で負の最大値(一番左が符号ビット)となるバイナリデータを 負の最大値(絶対値が最大ということですよね?)は 0 ではなくて、 01111111111 で間違いないですか? そして -1とか-2はどういうパターンになりますか? #00...001 と 00...010 かなあ

eakm26
質問者

補足

返信が遅れてしまって大変申し訳ありませんでした。 負の最大値は絶対値が最大ということです。 わかりにくくてすいませんでした。 -1は00000000001 -2は00000000010だと考えています。 (一番左の0がマイナスの符号ビットになっている) (+1は10000000001)

関連するQ&A

専門家に質問してみよう