in reply to Re^2: decimal to binary conversion
in thread decimal to binary conversion

The usage for <=> here in the masking expreasion ($decimal & 0x80) is to test if this 8th bit is zero or one, also you can do it like:

#!/usr/bin/perl -w use strict; use warnings; print "Enter decimal number less than 256:"; my $decimal; $decimal=<STDIN>; chomp $decimal; # $decimal += 0; print (($decimal & 0x80)? (1) : (0) ); # to test the 8th bit print (($decimal & 0x40)? (1) : (0) ); # to test the 7th bit print (($decimal & 0x20)? (1) : (0) ); # to test the 6th bit print (($decimal & 0x10)? (1) : (0) ); # to test the 5th bit print (($decimal & 0x08)? (1) : (0) ); # to test the 4th bit print (($decimal & 0x04)? (1) : (0) ); # to test the 3th bit print (($decimal & 0x02)? (1) : (0) ); # to test the 2nd bit print (($decimal & 0x01)? (1) : (0) ); # to test the 1st bit

Replies are listed 'Best First'.
Re^4: decimal to binary conversion
by AnomalousMonk (Archbishop) on Jun 05, 2015 at 15:24 UTC

    Are so many parentheses needed with the lower precedence  ? : Conditional Operator? Also, rather than using what looks like an unrolled loop for printing bits, is there any way to use a while- or for-loop here?


    Give a man a fish:  <%-(-(-(-<

      Yes, you can drop all the parens when you switch to the ternary operator. And yes, it can be done as a loop, which also removes the 8-bit restriction:

      $ cat 1129169.pl #!/usr/bin/env perl use 5.010; use strict; use warnings; sub dec_to_bin { my $dec = shift; print "$dec : "; unless( $dec =~ /^\d+$/ ){ say "Not a whole number!"; return; } my $x = 1; my $bin = ''; while(1){ my $bit = $dec & $x; $bin = ($bit ? 1 : 0) . $bin; $dec -= $bit; last unless $dec; $x <<= 1; } say $bin; } dec_to_bin($_) for @ARGV; $ perl 1129169.pl 0 1 4 255 65536 abc 0 : 0 1 : 1 4 : 100 255 : 11111111 65536 : 10000000000000000 abc : Not a decimal number!

      Aaron B.
      Available for small or large Perl jobs and *nix system administration; see my home node.