in reply to Re: bit pattern to bit position mapping
in thread bit pattern to bit position mapping

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.

  • Comment on Re^2: bit pattern to bit position mapping

Replies are listed 'Best First'.
Re^3: bit pattern to bit position mapping
by grinder (Bishop) on Nov 19, 2006 at 11:14 UTC
    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.

        It's a value judgement. I thought you valued a routine that works on arbitrary input. You value speed. Evidently, creating the array in my routine is an expensive proposition.

        I don't have time right now, but try recasting my algorithm to use index or substr. If you're really pressed for speed, a short XS routine should do the trick.

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