#!perl use warnings; use strict; # arithmetic operations on (nonegative) binary numbers sub addbin0 { my($a,$b) = @_; $a || $b ? ( chop($a) ? (chop($b) ? addbin1($a, $b) . "0" : addbin0($a, $b) . "1") : (chop($b) ? addbin0($a, $b) . "1" : addbin0($a, $b) . "0") ) : ""; } sub addbin1 { my($a,$b) = @_; $a || $b ? ( chop($a) ? (chop($b) ? addbin1($a, $b) . "1" : addbin1($a, $b) . "0") : (chop($b) ? addbin1($a, $b) . "0" : addbin0($a, $b) . "1") ) : "1"; } sub addbin { addbin0(@_) || "0"; } # multiplication algorithm to convert decimal number to binary our @dec2bin1 = qw(0 1 10 11 100 101 110 111 1000 1001); sub dec2bin { $_[0]=~/^\s*(-?)(\d+)/ or do { warn "dec2bin can not interpret its first argument as decimal"; return "0"; }; my($sgn, $dec) = ($1, $2); $dec=~/(\d)/g or die "internal error"; # this regexp always matches my $b = $dec2bin1[$1]; while($dec=~/(\d)/g) { $b = addbin($b . "0", $b . "000"); # multiply by 1010b $b = addbin($b, $dec2bin1[$1]); } $sgn . $b; } # convert a number print dec2bin($ARGV[0]), "\n"; __END__ #### # multiplication algorithm to convert decimal number to binary our @dec2bin1 = qw(0 1 10 11 100 101 110 111 1000 1001); sub dec2bin { $_[0]=~/^(-?)(\d*)/; my($sgn, $dec) = ($1, $2); $dec=~/(\d)/g; my $b = $dec2bin1[$1]; while($dec=~/(\d)/g) { $b = addbin($b . "0", $b . "000"); # multiply by 1010b $b = addbin($b, $dec2bin1[$1]); } $sgn . $b; }