x
Solved

Converting binary to decimal in PERL

Posted on 2010-09-06
Medium Priority
999 Views
I need some help writing a program in PERL that will convert input from the user from binary #, ie 0 or 1, into it's decimal equivalent.  I can not use the pack/unpack functions though.  it must be able to handle up to 20 characters and Use strict must be applied.  iI'm not sure where to start for this one.
0
Question by:PMG76
• 5
• 4
• 2

LVL 8

Expert Comment

ID: 33612466
Say
\$x_bin="0001001100101"
\$x_dec=613
so you need to convert \$x_bin into \$x_dec. Use oct():
\$x_dec = oct("0b".\$x_bin);

Quoting from man perlfunc:oct EXPR oct Interprets EXPR as an octal string and returns the corresponding value. (If EXPR happens to start off with "0x", interprets it as a hex string. If EXPR starts off with "0b", it is interpreted as a binary string. Leading whitespace is ignored in all three cases.)

You can also use Bit::Vector:
use Bit::Vector;
my \$v = Bit::Vector->new_Bin( 32, '0001001100101' );
print "dec: ", \$v->to_Dec(), "\n";

0

Author Comment

ID: 33613214
I have to get input for the user and spit out the resulting decimal number.  I'm not sure how to implement your description into my code.  It's kind of confusing.
0

LVL 85

Expert Comment

ID: 33613473

If you post your code, we can more easily determine how to integrate the above code into it.
0

Author Comment

ID: 33613479
Here is what Ive come up with so far.  When I am entering 20 digit binary numbers tho the hex numbers are a little off.  For example.  Enter a binary number up to 20 digits: 11111111111111111111
11111111111111111111 is 1048577 in decimal
The correct answer should be 1048575.
``````#!/usr/bin/perl

use warnings;
use strict;
print "\n";
print 'Enter a binary number up to 20 digits: ' ;
chomp ( my \$num = <> );

my \$pow=1;
my \$dec=0;
{
my \$bin=\$num;
until(\$num==0)
{
my \$bit=\$num%10;
\$dec=\$dec+(\$bit*\$pow);
\$pow=\$pow*2;
\$num=\$num/10;
}
print("\$bin is \$dec in decimal\n");
\$pow=1;
\$dec=0;
}
``````
0

LVL 85

Accepted Solution

ozo earned 2000 total points
ID: 33613488
#!/usr/bin/perl

use warnings;
use strict;
print "\n";
print 'Enter a binary number up to 20 digits: ' ;
chomp ( my \$num = <> );
my \$dec = oct("0b\$num");
print("\$num is \$dec in decimal\n");
0

LVL 85

Expert Comment

ID: 33613528
printf "%.9f\n",\$num;
0

LVL 8

Expert Comment

ID: 33617566
hmmm... that was my solution but no points for me...  :-)
0

Author Comment

ID: 34734190
OZO

I am looking at my code for this problem again and need some help.  Looking at my original code, not your code using oct, what do I need to correct to get the correct results?  I get the right answer when using eleven 1's, but not when using twenty 1's.
0

LVL 85

Expert Comment

ID: 34734394
You would need to treat \$num as a string rather than as a decimal number.
As a decimal number, twenty 1's exceeds the precision of the floating point numbers on your machine.

Either that or use an extended precision module.
0

Author Comment

ID: 34734467
It's been awhile since I have worked in perl.  How do I modify this to make it a string?
0

LVL 85

Expert Comment

ID: 34734587
#!/usr/bin/perl

use warnings;
use strict;
print "\n";
print 'Enter a binary number up to 20 digits: ' ;
chomp ( my \$num = <> );
{
my \$pow=1;
my \$dec=0;
my \$bin=\$num;
until(!\$num)
{
my \$bit=chop \$num;
\$dec=\$dec+(\$bit*\$pow);
\$pow*=2;
}
print("\$bin is \$dec in decimal\n");
}
0

Featured Post

Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.