今日ある友人に野暮用で会った。

彼がなぜだかPerlで2進数を扱うのに悩んでいたので回答。

彼が悩んでいたのは、2進数を10進数に変換する方法。

まっとうに考えると、こんな感じになるだろう。

sub bin2dec($){
    my $bin = shift;
    my $dec = 0;
    for my $i (split // => $bin){
        $dec = $dec*2+$i;
    }
    return $dec;
}

しかしこういう方法もある。

sub bin2dec($){
    my $bin = shift;
    my $dec = 0;
    $bin =~ s/([01])/$dec=$dec*2+$1/geo;
    return $dec;
}

極めつけは、この方法。

sub bin2dec($){
    $_[0] =~ /([01]+)/o;
    return eval "0b$1";
}

その逆の方は、ものすごい簡単。

sub dec2bin($){ sprintf "0b%b" => @_ }

この手のことは、表題の本に詳しいので是非。日本語版の監訳者には私も名を連ねてます。

Dan the JAPH