10 進数を N 進数に基数変換する

先日のLL Golf Hole 6 - 10進数を2進数に基数変換するを少し改良して N 進数に変換するものを作ってみます。 先日の延長線上で計算することができ、数字とアルファベットを用いることで 16 進数以上も表記することが可能です。

関数 conv_base_num() は第 1 引数に 10 進数の数を取り、第 2 引数に変換したい N 進数の N を取ります。

#! /usr/bin/gawk -f
# conv_base_num.awk

{
    print $0 " は 2 進数で " conv_base_num($0, 2);
    print $0 " は 8 進数で " conv_base_num($0, 8);
    print $0 " は 16 進数で " conv_base_num($0, 16);
}

# conv_base_num - convert decimal number to another base number
function conv_base_num(num, base,    rem, str, base_str, arr_base_str) {

    base_str = "1 2 3 4 5 6 7 8 9 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z";
    split(base_str, arr_base_str);

    while (num > 0) {
        rem = int(num % base);

        if (rem == 0) {
            str = "0" str;
        } else {
            str = arr_base_str[rem] str;
        }
        num = int(num / base);
    }

    return str;
}

実行してみます。

$ echo 100 | gawk -f conv_base_num.awk
100 は 2 進数で 1100100
100 は 8 進数で 144
100 は 16 進数で 64
$ echo 500 | gawk -f conv_base_num.awk
500 は 2 進数で 111110100
500 は 8 進数で 764
500 は 16 進数で 1F4

こんな感じでいかがでしょうか。

修正しました (2009/02/26)

LL Golf Hole 6 - 10進数を2進数に基数変換すると同様にメールにて N の乗数になる場合に 1 が欠落しているというご指摘を受け、上記スクリプトを修正させていただきました。ご指摘、ありがとうございます。 他にも間違えている箇所がありましたら hi_saito(at)yk.rim.or.jp 宛にメールでお知らせください。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png