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

  • 16
    いいね
  • 12
    コメント
この記事は最終更新日から1年以上が経過しています。

N進数からM進数への変換方法をまとめてみた。
他の言語での方法も足していきたいと思ってます〜

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

コマンドライン

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'と解釈されるので、アウトプットは16進数となる。
あと、16進数のアルファベットは大文字じゃないとNGなので注意。

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

デフォでは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) );

メジャーな基数用の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)