Conversor de decimal a binario y viceversa
El próposito de este código es puramente educativo. Toma un número de argv[1]
y lo convierte a binario separando la parte entera de la parte decimal. La parte
entera se convierte a binario dividiendo sucesivamente por 2 y tomando los restos.
La parte decimal, multiplicando por dos. Para volver a convertir a decimal, lee
la posición del bit y eleva 2 a la potencia del número de posición o su negativo en
el caso decimal. Se deja a ejercicio del lector realizarlo en hexadecimal.
#!/usr/local/bin/perl -w
$n = $ARGV[0];
if ($n+0 ne $n) { die "Not a number"; }
if ($n<0) { $n = abs ($n); $flag="-"; }else {$flag = ""; }
$i = int($n);
$j = $n-$i;
for (;;){
push @ii, $i%2;
$i = int($i/2);
if ($i<=1){ push @ii, "$i"; last; }
}
@ii=reverse(@ii);
for (;;){
$j *=2;
if ($j>=1) { push @jj, "1"; }
else { push @jj, "0"; }
$j -= int($j);
if ($j==0) { last; }
}
$str= $flag."@ii"."."."@jj";
$str =~ s/ //g;
print "$str\n";
$str =~ s/(\d+)\.(\d+)/$1\.$2/;
$a=$1; $b=$2;
for $i (0..length($a)-1){
$num += (2**$i)*substr($a,-1,1,"");
}
for $j (1..length($b)){
$num += (2**(-$j))*substr($b,0,1,"");
}
if ($flag eq "-") { $num *=-1; }
print "$num\n";
__END__