• ベストアンサー

BCDについて

バイナリーデータをBCD変換したいのですが、C言語でどのようにプログラムを組んだらいいのかわからないので、だれか教えてください。

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

  • ベストアンサー
  • tokpy
  • ベストアンサー率47% (1313/2783)
回答No.1

私はCはほとんどしたことがないのですが,機械語でそのようなプログラムを組む場合,10で割っていって余りを記録し,割られる数が0になるまで繰り返して組んだ記憶があります。アルゴリズムは言語が変わっても同じだと思います。 例)123をBCDに直す場合, 123÷10=12・・・3 12÷10=1・・・2 1÷10=0・・・1 これを逆に並べて「123」というBCDデータになりました。 もしかするとこの程度はCのライブラリにあるかもしれませんね。

yo0924yo
質問者

お礼

ありがとうございました。ビットをシフトさせていったら出来るのかなとか考えていたのですが、出来なくて困っていました。教えていただいた方法ならわかりやすいですね。大変助かりました。

その他の回答 (3)

回答No.4

>バイナリデータは16ビットです。 bcd = ((n/10000)<<16)|(((n%10000)/1000)<<12)|(((n%1000)/100)<<8)|(((n%100)/10)<<4)|(n%10); ですが、見にくいので、ANo.1さんの手を使いましょう。 答えが最大20ビットになるので、20ビット以上を扱える型が必要です。文字型で欲しければANo.2さんのsprintfです。 unsigned int bin2bcd(unsigned int n) { unsigned int bcd=0; unsigned int base=0; while (n>0){ bcd |= (n%10)<<base; base += 4; n /= 10; } return bcd; }

yo0924yo
質問者

お礼

ご丁寧にありがとうございました。大変参考になりました。

回答No.3

バイナリデータは何ビットでしょうか? 例えば、データが8ビットなら0x000~0x255のコードが得られればいいのですよね。 bcd = ((n/100)<<8)|(((n%100)/10)<<4)|(n%10); 桁数が増えそうならANo.1の方法でループさせた方がいいかも。

yo0924yo
質問者

お礼

ありがとうございました。バイナリデータは16ビットです。

  • shige_70
  • ベストアンサー率17% (168/946)
回答No.2

安直な方法として、sprintf()で10進表記の文字列にしてから、それをstrtol()の第3引数に16を渡してやれば出来そうです。

yo0924yo
質問者

お礼

ありがとうございました。試して見ます。