macoril's diary

へたれプログラマーのリハビリな日々

N進数からM進数への変換 〜いろんな言語で〜

本記事はQiitaに移しました。
N進数からM進数への変換 〜いろんな言語で〜 - Qiita

はてブロとQiitaの住み分けは↓みたいにしていく予定。 * はてブロ:備忘録 経緯や経過を正解もハズレもゴチャゴチャとメモする感じ。 * Qiita:まとめ ゴチャゴチャを整理、内容を精査したチートシート的な内容。


N進数からM進数への変換方法をまとめてみた。

number_str: 変換元の数値
from_base : 変換元の基数
to_base   : 変換先の基数

コマンドライン

echo "obase=to_base; ibase=from_base; number_str" | bc

ibaseを先に書くと、obaseで指定する値がibaseで指定した進数で解釈されるので、obaseを先に指定したほうが良い 例えば、

echo "ibase=16; obase=10; number_str" | bc

とした場合、obaseで指定した10は16進数の'10'と解釈されるので、アウトプットは16進数となる。 あと、16進数のアルファベットは大文字じゃないとNGなので注意。

10進数⇔16進数、10進数⇔8進数ならprintfも簡単。

printf '%x' 15
printf '%d' 0xF
printf '%o' 15
printf '%d' 017

こっちの場合は小文字でもOK。

JavaScript

parseInt(number_str, from_base).toString(to_base);

parseInt()で一度10進数にしてから、toStringで変換する。

Perl

デフォでは2,8,10,16以外の基数の変換を簡単に行う方法はなさそう。 Math::BaseCalcモジュールを使うとそれ以外の基数への変換が容易にできて、使用する英数字の指定などもできるよう。

$calc7  = new Math::BaseCalc(digits=>[0..6]);
$calc36 = new Math::BaseCalc(digits=>[0..9,'a'..'z']);

$calc36->to_base( $calc7->from_base(number_str) );

PHP

base_convert($number_str, $from_base, $to_base);

decbin(), bindec(), decoct(), octdec(), dechex(), hexdec()とあるけど、base_convert()だけ覚えておけば十分。 わざわざ他を使うメリットってあるのかな?

Python

2,8,10,16進数以外の基数の変換を簡単に行う方法はなさそう。

10進数に戻すのは下記の方法でできる。

int(number_str, from_base)

10進数からの変換は、bin(), oct(), hex()、あるいは、8進数、16進数なら文字列フォーマット操作を使うのが簡単。

'%o' % number_str #8進数へ
'%x' % number_str #16進数へ

Ruby

number_str.to_i(from_base).to_s(to_base)

JavaScriptと同じで、to_i()で一度10進数に戻してからto_s()で変換する。

おまけ

エラー処理とか特にしてないけどideoneで少しサンプル書いた

JavaScript(Node.js)

PHP