Why not login to Qiita and try out its useful features?

We'll deliver articles that match you.

You can read useful information later.

20
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-02-29

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 3

  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)

20
18
12

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Qiita Advent Calendar is held!

Qiita Advent Calendar is an article posting event where you post articles by filling a calendar 🎅

Some calendars come with gifts and some gifts are drawn from all calendars 👀

Please tie the article to your calendar and let's enjoy Christmas together!

20
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?