Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl Monk, Perl Meditation
 
PerlMonks  

binary converter

by perlnoobz (Initiate)
on Apr 22, 2013 at 15:11 UTC ( #1029904=perlquestion: print w/ replies, xml ) Need Help??
perlnoobz has asked for the wisdom of the Perl Monks concerning the following question:

i do not understand the foreach loop..can anyone explain to me what is it doing?

#!/usr/bin/perl -w print "Your binary input please =>"; $bin = <STDIN>; #read in user input chomp $bin; # use of array to store $bin and split it @digits = reverse(split('',$bin)); #reverse and split $bin, then assig +n to an array $result = 0; foreach $pos (0..$#digits) { $result += $digits[$pos] * 2 ** $pos; } print $result;

Comment on binary converter
Download Code
Re: binary converter
by CountOrlok (Friar) on Apr 22, 2013 at 15:18 UTC
    Try the code with a simple binary number, e.g. 100
    @digits will be (0,0,1). And $result will be 0*2^0 + 0*2^1 + 1*2^2 = 4.
Re: binary converter
by Limbic~Region (Chancellor) on Apr 22, 2013 at 15:30 UTC
    perlnoobz,
    I will re-write your code and explain it. I hope it makes sense and isn't more confusing to you.
    #!/usr/bin/perl use strict; use warnings; # Obtain a binary string from the user or die trying print "Your binary input please => "; chomp(my $bin = <STDIN>); die "'$bin' is not binary\n" if $bin =~ /[^01]/; # Binary numbers are easier to convert right to left # We will reverse the numbers to do this my @position = reverse split //, $bin; # Now the right most value is in the first slot of the array # And the left most value is in the last slot of the array my $tot = 0; # Normally when we loop over an array, we loop over its values # In this case, looping over its indices allows us to do powers of 2 # $#position is the last index in the array for my $idx (0 .. $#position) { $tot += $position[$idx] * 2 ** $idx; # had a typo here with $digi +t[$idx] } print "\n$tot\n";

    Cheers - L~R

      The position shoul be digit :-)

      In either case you do not need the index nor the ** operator.

      my @digit = reverse split //, $bin; my $num = 0; for my $bit (@digit) { $num = $num * 2 + $bit; } print "\n$num\n";

      Jenda
      Enoch was right!
      Enjoy the last years of Rome.

        Jenda,
        Or digit should have been position.

        I wouldn't have written the code I did for myself - it was intended to be more instructional since the OP indicated not understanding the for loop. I guess I should have paid closer attention (updated now). Thanks!

        Cheers - L~R

Re: binary converter
by toolic (Bishop) on Apr 22, 2013 at 15:36 UTC

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1029904]
Approved by Corion
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others scrutinizing the Monastery: (5)
As of 2015-07-01 23:36 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (25 votes), past polls