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)