綾小路龍之介の素人思考

[perl] 10進数から2進数への変換、一般に基数変換

Math::BaseCalc モジュールを使えばいいのに、という話。

Fという数のp進数への基数変換ってつまり以下の更新式に従って、F_n mod pを逆に並べるということ。F_{n+1}が0になれば計算終了。

F_n = p * F_{n+1} + F_n mod p
n = 0;

移行してF_nの項とF_{n+1}の項を分離。

F_{n+1} = (F_n - F_n mod p) / p
n = 0;

コード的には以下。

my $Fn  = 192;
my $p   = 2;
my $str = "";
do {
        my $Fnmodp = ($Fn % $p);
        $str = "$Fnmodp $str";
        $Fn = ($Fn - $Fnmodp) / $p;
} while ($Fn == 0);
print $str;

一行で書くと以下。

$ perl -le '$Fn=192; $p=2; $str=""; do{$Fnmodp=($Fn%$p); $str="$Fnmodp $str"; $Fn=($Fn-$Fnmodp)/$p;}while($Fn); print $str;'
1 1 0 0 0 0 0 0
$ perl -le '$Fn=16*10+14; $p=16; $str=""; do{$Fnmodp=($Fn%$p); $str="$Fnmodp $str"; $Fn=($Fn-$Fnmodp)/$p;}while($Fn); print $str;'
10 14

わざわざ書かなくてもMath::BaseCalcという基数変換モジュールがある。

リファレンス

  1. Math::BaseCalc - 様々な基数間で数値を変換するモジュール
  2. Perl] Math::BaseCalcおもしろいね たまには呪文をとなえてみるか:仕事版/ウェブリブログ
  3. use Math::BaseCalc; - Google 検索
  4. 【CGI・Perl】基数変換したい
  5. perl 基数変換 - Google 検索

ソーシャルブックマーク

  1. はてなブックマーク
  2. Google Bookmarks
  3. del.icio.us

ChangeLog

  1. Posted: 2009-06-15T22:32:25+09:00
  2. Modified: 2009-06-15T22:32:25+09:00
  3. Generated: 2018-10-02T23:09:10+09:00