Ruby
Perl
PHP
JavaScript
Linux

基数変換コマンドまとめ 〜N進数からM進数への変換をいろんな言語で〜

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()で変換する。





  1. 厳密には「10進数」というわけではなく、文字列型から数値型への変換が行われています。コメント欄のscivolaさんのお話を参照してくださいm(..)m 



  2. parseInt() - JavaScript | MDN, Number.prototype.toString() - JavaScript | MDN 



  3. PHP: base_convert - Manual 



  4. instance method String#to_i (Ruby 2.3.0), instance method Integer#to_s (Ruby 2.3.0)