in reply to bit pattern to bit position mapping

You can use unpack to do most of the grunt work

sub b2i { return split //, unpack('b*', @_); }
This also obviates the need to determine whether it is a 32-bit or 64-bit quantity. You'll may get a number of zeros at the end of the array. You could clip the unnecessary zeros before splitting into values with:
sub b2i { my $bitstring = unpack('b*', @_); $bitstring =~ s/0+$//; return split //, $bitstring; }

• another intruder with the mooring in the heart of the Perl

Replies are listed 'Best First'.
Re^2: bit pattern to bit position mapping
by Anonymous Monk on Nov 19, 2006 at 10:36 UTC

    I'm after the positions of the set bits, not the bits themselves.

    Please see the comment in the code sample for what I mean.

      I'm after the positions of the set bits

      Ah so sorry, I left that as an exercise for the reader. All you have to do is run through the array of 0,1 values, and push the offset to another array if the value is 1. Then return that array. Which goes something like (untested)

      sub set_bit_offsets { my @bitmap = split //, unpack('b*', @_); my @offset; for my $off (0..$#bitmap) { if ($bitmap[$off] == 1) { push @offset, $off; } } return @offset; }

      In terms of efficiency, yes, that could be written as a one-liner. That would be something like:

      sub set_bit_offsets { my @bitmap = split //, unpack('b*', @_); return grep {$bitmap[$_]} 0..$#bitmap; }

      • another intruder with the mooring in the heart of the Perl

        Oh, sorry. I misunderstood you.

        That's about half the speed of the version I posted.