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 宛にメールでお知らせください。




