Location : Home > Languages > Perl > Package
Title : Math::BaseCalc
Toolbox Logo

名称

 Math::BaseCalc - 異なる基で表現された数の変換


概要

use Math::BaseCalc;

my $calc = new Math::BaseCalc(digits => [0,1]); #2進数
my $bin_string = $calc->to_base(465); # 465 を2進数に変換

$calc->digits('oct'); # 8進数
my $number = $calc->from_base('1574'); # 8進数の 1574 を10進数に変換

説明

 本モジュールは異なる基で表現された数を互いに変換するためものである。自分で定義した基を用いてもよいし、既によく使われている基を用いてもよい。

 to_base() メソッドと from_base() メソッドは Perlにおける数値表現と他の基のもとで表現される数値表現同士を変換する。
 例えば、2進表現 [0,1] を用いているなら、 $calc->to_base(5) とすれば結果は "101" となる。一方、 $calc->from_base("101") とすれば 5 を返す。

 例えば7進表現から36進表現に変換したければ、まず Perl における数値表現に変換し、しかるのちに望む基に変換するという2段階を経ればよい。

$calc7  = new Math::BaseCalc(digits=>[0..6]);
$calc36 = new Math::BaseCalc(digits=>[0..9,'a'..'z'];
$in_base_36 = $calc36->to_base( $calc7->from_base('3506') );

 もし通常の8進表現や16進表現を利用したいのなら、本モジュールを使う必要はない。sprintf(), oct(), hex()を見よ。


メソッド

new Math::BaseCalc
new Math::BaseCalc(digits=>...)

 新たな基の使用を宣言する。
 使用する数値(digits)をリスト参照の形で羅列するか(ただしリストは昇順で並べられており、'0' は最初にあること)、既に定義されている名称(digit() メソッドを参照のこと)で指定する。

$calc->to_base(NUMBER)

 NUMBER で指定された(Perlにおける)数値を、$calcで指定されている基における表現に変換する。

$calc->from_base(STRING)

 STRING で指定された($calcで指定されている基における)文字列を、Perlにおける整数に変換する。
 ただしSTRING の指定が無意味である場合の振る舞いは未定義である。

$calc->digits
$calc->digits(...)

使用している進数の数値リストを表示するまたは変更する。  引数が指定されなければ現在の進数で用いている数値(digits)のリストを返す。  進数で用いる数値(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'],

$calc->digits('bin');
$calc->digits([0..7]);
$calc->digits([qw(w a l d o)]);

 また1文字以上の数値を指定した場合の振る舞いは未定義である。


問題

 '64' 進数の場合は Base64 encoding を利用するとよい。私も MIME::Base64.pm モジュールを利用した。これは正しいのだろうか? 確かに妙な気はする。


著者

 Ken Williams, <ken@forum.swarthmore.edu>


著作権

 これはフリーソフトウェアである。(This is free software in the colloquial nice-guy sense of the word.)
 Copyright (c) 1999, Ken Williams.
Perl 本体と同等の条件で修正・再配布してもよい。


参考資料

 perl(1).

Toolbox Logo
Updated : 2006/08/01