Solved

Converting binary to decimal in PERL

Posted on 2010-09-06
11
801 Views
Last Modified: 2012-06-21
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
Comment
Question by:PMG76
  • 5
  • 4
  • 2
11 Comments
 
LVL 8

Expert Comment

by:pvlier
Comment Utility
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

by:PMG76
Comment Utility
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 84

Expert Comment

by:ozo
Comment Utility
What are you confused about?

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

Author Comment

by:PMG76
Comment Utility
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
 
LVL 84

Accepted Solution

by:
ozo earned 500 total points
Comment Utility
#!/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
How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

 
LVL 84

Expert Comment

by:ozo
Comment Utility
To see the problem with your method, add
printf "%.9f\n",$num;
to your loop
0
 
LVL 8

Expert Comment

by:pvlier
Comment Utility
hmmm... that was my solution but no points for me...  :-)
0
 

Author Comment

by:PMG76
Comment Utility
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 84

Expert Comment

by:ozo
Comment Utility
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

by:PMG76
Comment Utility
It's been awhile since I have worked in perl.  How do I modify this to make it a string?
0
 
LVL 84

Expert Comment

by:ozo
Comment Utility
#!/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

Find Ransomware Secrets With All-Source Analysis

Ransomware has become a major concern for organizations; its prevalence has grown due to past successes achieved by threat actors. While each ransomware variant is different, we’ve seen some common tactics and trends used among the authors of the malware.

Join & Write a Comment

Checking the Alert Log in AWS RDS Oracle can be a pain through their user interface.  I made a script to download the Alert Log, look for errors, and email me the trace files.  In this article I'll describe what I did and share my script.
In this post we will learn how to connect and configure Android Device (Smartphone etc.) with Android Studio. After that we will run a simple Hello World Program.
Learn how to get help with Linux/Unix bash shell commands. Use help to read help documents for built in bash shell commands.: Use man to interface with the online reference manuals for shell commands.: Use man to search man pages for unknown command…
Learn how to navigate the file tree with the shell. Use pwd to print the current working directory: Use ls to list a directory's contents: Use cd to change to a new directory: Use wildcards instead of typing out long directory names: Use ../ to move…

772 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

12 Experts available now in Live!

Get 1:1 Help Now