[Webinar] Streamline your web hosting managementRegister Today

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 968
  • Last Modified:

Converting binary to decimal in PERL

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
PMG76
Asked:
PMG76
  • 5
  • 4
  • 2
1 Solution
 
pvlierCommented:
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
 
PMG76Author Commented:
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
 
ozoCommented:
What are you confused about?

If you post your code, we can more easily determine how to integrate the above code into it.
0
Never miss a deadline with monday.com

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

 
PMG76Author Commented:
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;
}

Open in new window

0
 
ozoCommented:
#!/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
 
ozoCommented:
To see the problem with your method, add
printf "%.9f\n",$num;
to your loop
0
 
pvlierCommented:
hmmm... that was my solution but no points for me...  :-)
0
 
PMG76Author Commented:
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
 
ozoCommented:
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
 
PMG76Author Commented:
It's been awhile since I have worked in perl.  How do I modify this to make it a string?
0
 
ozoCommented:
#!/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

Learn to develop an Android App

Want to increase your earning potential in 2018? Pad your resume with app building experience. Learn how with this hands-on course.

  • 5
  • 4
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now