N進数からM進数への変換をしたいときに
各言語でどんなコマンド/関数を使えばいいのかまとめてみた。
基本的な基数である2,8,10,16以外の方法にも言及するつもり。
number_str: 変換元の数
from_base : 変換元の基数
to_base : 変換先の基数
LinuxやUNIXのコマンドライン
echo "obase=to_base; ibase=from_base; number_str" | bc
obase,ibaseで指定できる値は、2以上の整数ならなんでもOK。
ibaseを先に指定すると、obaseで指定する値がibaseで指定した進数で解釈されてしまうので、obaseを先に指定したほうが良い。
例えば、
echo "ibase=16; obase=10; number_str" | bc
とした場合、obaseで指定した10は16進数の'10'と解釈されるので、
echo "obase=16; ibase=16; number_str" | bc
と解釈されてアウトプットは16進数となる。
あと、16進数のアルファベットは大文字じゃないとNGなので注意。
上記をエイリアスにしました。
https://gist.github.com/macoril/2cd76be7577507296a5f8219fe0904a9
10進数⇔16進数, 10進数⇔8進数ならprintfも簡単。
printf '%d' 0xF #15
printf '%o' 017 #15
printf '%x' 15 #f
printf '%o' 15 #17
こっちの場合は小文字でもOK。
JavaScript
parseInt(number_str, from_base).toString(to_base);
parseInt()で一度10進数にしてから1、toStringで変換する。
from_base, to_baseで指定できる値は、2から36までの整数2。
Perl
oct '0b' . number_str; # 2進数→10進数
oct number_str; # 8進数→10進数
hex number_str; # 16進数→10進数
sprintf '%b', number_str; # 10進数→ 2進数
sprintf '%o', number_str; # 10進数→ 8進数
sprintf '%x', number_str; # 10進数→16進数
2,8,10,16以外の基数の変換を行いたい場合は
Math::BaseCalcモジュールを使う。
use 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) );
メジャーな基数用のdigitsは予め用意されている。
bin => [0,1],
hex => [0..9,'a'..'f'],
HEX => [0..9,'A'..'F'],
oct => [0..7],
64 => ['A'..'Z','a'..'z',0..9,'+','/'],
62 => [0..9,'a'..'z','A'..'Z'],
PHP
base_convert($number_str, $from_base, $to_base);
from_base, to_baseで指定できる値は、2から36までの整数3。
decbin(), bindec(), decoct(), octdec(), dechex(), hexdec()とあるけど、base_convert()だけ覚えておけば十分。
わざわざ他を使うメリットってあるのかな?知ってる人教えてーm(..)m
Python
2,8,10,16進数以外の基数の変換を簡単に行う方法はなさそう。
10進数に戻す1のは下記の方法でできる。
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)
from_base, to_baseで指定できる値は、2から36までの整数4(from_baseには0の指定も可能)。
JavaScriptと同じで、to_i()で一度10進数に戻してから1、to_s()で変換する。
-
厳密には「10進数」というわけではなく、文字列型から数値型への変換が行われています。コメント欄のscivolaさんのお話を参照してくださいm(..)m ↩ ↩2 ↩3
-
parseInt() - JavaScript | MDN, Number.prototype.toString() - JavaScript | MDN ↩
-
instance method String#to_i (Ruby 2.3.0), instance method Integer#to_s (Ruby 2.3.0) ↩