There's (almost) always a shorter way ;-)
First, you're doing the if (...) { ... } else { ... } thing a total of 8 times, so you can reduce that portion of your program by a factor of 8 if you do something like this:
use warnings;
use strict;
print "Please input a decimal no. to convert to binary : ";
chomp (my $value = <STDIN>);
apply_mask($value, 128);
apply_mask($value, 64);
apply_mask($value, 32);
apply_mask($value, 16);
apply_mask($value, 8);
apply_mask($value, 4);
apply_mask($value, 2);
apply_mask($value, 1);
sub apply_mask {
my $value = shift;
my $mask = shift;
if ($value & $mask) {
print "1";
} else {
print "0";
}
}
But since the numbers 1 ... 128 are easily computable as powers of two, you could simplify it to:
use warnings;
use strict;
print "Please input a decimal no. to convert to binary : ";
chomp (my $value = <STDIN>);
foreach my $power (0..7) {
# Originally 2 ** $power, but that's backwards!
my $mask = 2 ** (7 - $power);
apply_mask($value, $mask);
}
sub apply_mask {
my $value = shift;
my $mask = shift;
if ($value & $mask) {
print "1";
} else {
print "0";
}
}
By the way, just to show you that TMTOWTDI (= "There's more than one way to do it!" = the Perl motto), here's a lookup table solution which trades memory for speed (ie. uses a lot of memory, but is relatively fast):
use strict;
use warnings;
my @binary_table = qw(
0 1 10 11 100 101 110 1
+11
1000 1001 1010 1011 1100 1101 1110 11
+11
10000 10001 10010 10011 10100 10101 10110 101
+11
11000 11001 11010 11011 11100 11101 11110 111
+11
100000 100001 100010 100011 100100 100101 100110 1001
+11
101000 101001 101010 101011 101100 101101 101110 1011
+11
110000 110001 110010 110011 110100 110101 110110 1101
+11
111000 111001 111010 111011 111100 111101 111110 1111
+11
1000000 1000001 1000010 1000011 1000100 1000101 1000110 10001
+11
1001000 1001001 1001010 1001011 1001100 1001101 1001110 10011
+11
1010000 1010001 1010010 1010011 1010100 1010101 1010110 10101
+11
1011000 1011001 1011010 1011011 1011100 1011101 1011110 10111
+11
1100000 1100001 1100010 1100011 1100100 1100101 1100110 11001
+11
1101000 1101001 1101010 1101011 1101100 1101101 1101110 11011
+11
1110000 1110001 1110010 1110011 1110100 1110101 1110110 11101
+11
1111000 1111001 1111010 1111011 1111100 1111101 1111110 11111
+11
10000000 10000001 10000010 10000011 10000100 10000101 10000110 100001
+11
10001000 10001001 10001010 10001011 10001100 10001101 10001110 100011
+11
10010000 10010001 10010010 10010011 10010100 10010101 10010110 100101
+11
10011000 10011001 10011010 10011011 10011100 10011101 10011110 100111
+11
10100000 10100001 10100010 10100011 10100100 10100101 10100110 101001
+11
10101000 10101001 10101010 10101011 10101100 10101101 10101110 101011
+11
10110000 10110001 10110010 10110011 10110100 10110101 10110110 101101
+11
10111000 10111001 10111010 10111011 10111100 10111101 10111110 101111
+11
11000000 11000001 11000010 11000011 11000100 11000101 11000110 110001
+11
11001000 11001001 11001010 11001011 11001100 11001101 11001110 110011
+11
11010000 11010001 11010010 11010011 11010100 11010101 11010110 110101
+11
11011000 11011001 11011010 11011011 11011100 11011101 11011110 110111
+11
11100000 11100001 11100010 11100011 11100100 11100101 11100110 111001
+11
11101000 11101001 11101010 11101011 11101100 11101101 11101110 111011
+11
11110000 11110001 11110010 11110011 11110100 11110101 11110110 111101
+11
11111000 11111001 11111010 11111011 11111100 11111101 11111110 111111
+11
);
print "Please input a decimal no. to convert to binary : ";
chomp (my $value = <STDIN>);
my $binary = $binary_table[$value];
if (!defined($binary)) {
die "Sorry, value $value isn't in the table!\n";
}
print "Decimal $value = Binary $binary\n";
It only works for values from 0 to 255, though.
Update: Oh, yes ... if you want shorter code instead of faster execution, here's a fancier way of writing it fairly succinctly:
use warnings;
use strict;
print "Please input a decimal no. to convert to binary : ";
chomp (my $value = <STDIN>);
print map { ($value & (1 << (7 - $_)))? 1: 0 } ( 0 .. 7 );
print "\n";
Update 2: Reversed the effective order the bits are printed in to make it msb first and lsb last (thanks for pointing that out ysth++).
s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/
|