C言語関係掲示板

過去ログ

No.582.BCDで16進数を使って10進数を表したい

[戻る] [ホームページ]
No.5438

16進数を使って10進数を表す
投稿者---megu(2003/03/04 19:29:46)


BCD(2進化10進法)の考えを基に、16進数を使って10進数を
表したいのですがよく分かりません。
BCDとは16進数のうちA〜Fを使わないようにしたもので
(16進) 1〜9, A , B・・F,10,11,〜となるところが、
(BCD) 1〜9,10,11〜 とさも普通の10進数のようになります。
printfでは「%x」をもちろん使います。どなたか分かる人助けてください!


No.5446

Re:16進数を使って10進数を表す
投稿者---ともじ(2003/03/04 23:49:07)


こんばんは。

>BCD(2進化10進法)の考えを基に、16進数を使って10進数を
>表したいのですがよく分かりません。

こんな感じでしょうか。

#include <stdio.h>

int main(void)
{
    unsigned short x, tmp, a, b;
    
    for (x = 0; x < 1000; x++) {
        tmp = x;
        a = 1;
        b = 6;
        while (x / a > 1) {
            a *= 10;
            tmp += x / a * b;
            b *= 0x10;
        }
        printf("%x\t", tmp);
    }
    
    return 0;
}      


No.5456

Re:16進数を使って10進数を表す
投稿者---ともじ(2003/03/05 08:27:08)


すみません。

unsigned short では、9999までしか算出できないので、
unsigned long にしてください。99999999まで算出可能です。


No.5471

Re:16進数を使って10進数を表す
投稿者---megu(2003/03/05 21:16:18)


>すみません。
>
>unsigned short では、9999までしか算出できないので、
>unsigned long にしてください。99999999まで算出可能です。
ともじさん、どうもありがとうございました!



No.5475

Re:16進数を使って10進数を表す
投稿者---かずま(2003/03/05 22:25:52)


>    tmp = x;
>    a = 1;
>    b = 6;
>    while (x / a > 1) {
>        a *= 10;
>        tmp += x / a * b;
>        b *= 0x10;
>    }

理解するのに数分かかってしまいました。
私なら、次のように書きますが、ビット演算に慣れていない人には分かりにくいかも。
    a = x;
    for (tmp = b = 0; a != 0; b += 4) {
        tmp += a % 10 << b;
        a /= 10;
    }

ライブラリを使うとしたら、

    char buf[24];
    sprintf(buf, "%lu", x);
    tmp = strtoul(buf, NULL, 16);


No.5478

Re:16進数を使って10進数を表す
投稿者---ともじ(2003/03/05 23:48:56)


いつもお世話になります。

>理解するのに数分かかってしまいました。

最初、シフトにしようと思ったのですが、紙に書き出して眺めていると、
0x0a + 0x06 → 0x10、0xa0 + 0x60 → 0x100、・・・
とすればいいのか、と単純に思いついて、そのままコードにしてしまい
ました。でも、やっぱりシフトの方がわかりやすいですね。

>ライブラリを使うとしたら、

なるほど、こういう解き方もできますね。これは、思いつきませんでした。