cyocum has asked for the wisdom of the Perl Monks concerning the following question:

I found some code here on how to translate between binary and decimal code:

sub dec2bin { my $str = unpack("B32", pack("N", shift)); $str =~ s/^0+(?=\d)//; # otherwise you'll get leading zeros return $str; } sub bin2dec { return unpack("N", pack("B32", substr("0" x 32 . shift, -32))); }

The problem I am having is that I get the EXACT same binary out no matter what I put into the dec2bin function. The same goes the other way around. I am using Perl on a Win32 system.

The reason I want to be able to do this is because I am trying to build a binary matrix of every combination depending on the number of columns that the user supplies. How I intend to figure this is out is by taking a "1" for every column thus a 3 column matrix will have a binary "111". Take this number and translate it into decimal will give you the number of rows needed for the matrix. Then I will count from 0 to 7 (for a 3 column matrix). Then transate the row number into binary and that will give me the 1's and 0's for each row in column order. Therefore, I need a reliable way of translating from binary to decimal and back again.

Thanks for any replies on this!

Replies are listed 'Best First'.
Re: Binary to Decimal Translation
by tadman (Prior) on Jul 13, 2001 at 00:33 UTC
    An easier way to do the conversion might be something on the order of:
    sub dec2bin { return sprintf("%b",shift); }
    The bin2dec function you have seems the same as that of merlyn in RE: Binary to Decimal (zdog's way), but I'm sure there's a better way.

    Either way, I'm not exactly sure what you're getting at with your requirement for binary math. If you want to know the number of possibilities for a given set of bits, you can just do this:
    sub combo { return (2**shift)-1; }
Re: Binary to Decimal Translation
by Chmrr (Vicar) on Jul 13, 2001 at 01:24 UTC
    I'm afraid I cannot replicate your problem. Running Perl 5.6.1 under Windows NT, the following code:
    sub dec2bin { my $str = unpack("B32", pack("N", shift)); $str =~ s/^0+(?=\d)//; # otherwise you'll get leading zeros return $str; } sub bin2dec { return unpack("N", pack("B32", substr("0" x 32 . shift, -32))); } print bin2dec("101")," ",bin2dec("111"),"\n"; print dec2bin(5), " ",dec2bin(7) ,"\n";
    ..produces:
    5 7 101 111
    ..exactly as expected. Perhaps you could show up some of the code that attempts to use these functions? Or perhaps I'm misunderstanding you when you state you "get the exact same binary out."

     
    perl -e 'print "I love $^X$\"$]!$/"#$&V"+@( NO CARRIER'

      My bad. I was using an object to wrap some of the funtionality. I forgot to my $self = shift;. It was trying to turn the ref into binary and doing a good job too. Just reminds me that garbage in garbage out.
Re: Binary to Decimal Translation
by jeroenes (Priest) on Jul 13, 2001 at 00:59 UTC
    Damn, indeed I was wrong! I was put on the wrong leg by the statement 'same number whatever I do'... so please ignore this node.... should learn me posting near bedtime. 
      You are wrong. If it were using the bareword "shift", it would always return zero, but it doesn't.
Re: Binary to Decimal Translation
by no_slogan (Deacon) on Jul 13, 2001 at 01:02 UTC
    I'm not quite sure I understand the question. Are you asking for a binary representation with the correct number of leading zeroes? So the three column matrix would get 000, 001, 010, ... 111. If that's the case, use this to get rid of the extra zeroes instead of the s///:
    $str = substr($str, -$digits);