- ベストアンサー
BCDについて
バイナリーデータをBCD変換したいのですが、C言語でどのようにプログラムを組んだらいいのかわからないので、だれか教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
私はCはほとんどしたことがないのですが,機械語でそのようなプログラムを組む場合,10で割っていって余りを記録し,割られる数が0になるまで繰り返して組んだ記憶があります。アルゴリズムは言語が変わっても同じだと思います。 例)123をBCDに直す場合, 123÷10=12・・・3 12÷10=1・・・2 1÷10=0・・・1 これを逆に並べて「123」というBCDデータになりました。 もしかするとこの程度はCのライブラリにあるかもしれませんね。
その他の回答 (3)
- JaritenCat
- ベストアンサー率37% (122/322)
>バイナリデータは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; }
お礼
ご丁寧にありがとうございました。大変参考になりました。
- JaritenCat
- ベストアンサー率37% (122/322)
バイナリデータは何ビットでしょうか? 例えば、データが8ビットなら0x000~0x255のコードが得られればいいのですよね。 bcd = ((n/100)<<8)|(((n%100)/10)<<4)|(n%10); 桁数が増えそうならANo.1の方法でループさせた方がいいかも。
お礼
ありがとうございました。バイナリデータは16ビットです。
- shige_70
- ベストアンサー率17% (168/946)
安直な方法として、sprintf()で10進表記の文字列にしてから、それをstrtol()の第3引数に16を渡してやれば出来そうです。
お礼
ありがとうございました。試して見ます。
お礼
ありがとうございました。ビットをシフトさせていったら出来るのかなとか考えていたのですが、出来なくて困っていました。教えていただいた方法ならわかりやすいですね。大変助かりました。