http://www.perlmonks.org?node_id=1015599


in reply to Re: Efficient bit counting with a twist.
in thread Efficient bit counting with a twist.

Using it to count set bits in the whole bytes before your position and then, if necessary, those bits in the partial byte up to but not including it via a mask might be viable.

Yes. That works and is the same scheme questor came up with (rather more compactly:) in Re: Efficient bit counting with a twist..

But the best answer is the one AnomalousMonk pointed out in Re: Efficient bit counting with a twist..

Ie. To recognise that the unpack template '%32b*' is not a indivisible token saying 'count the bits', but actually contains 3 parts:

  1. %32 accumulate a 32-bit count ...
  2. b of the binary bits set ...
  3. * for all the bits in the string.

And that by simply interpolating $p into the template, in place of *, it counts the set bits within the first $p bits of the string.

Perl had the problem solved; I just didn't recognise it :) (Hence my: D'oh! D'oh! D'oh!..... moment. :)


With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

Replies are listed 'Best First'.
Re^3: Efficient bit counting with a twist.
by davido (Cardinal) on Jan 28, 2013 at 02:32 UTC

    Thanks for the explanation. I wasn't getting his solution at first until I saw your description of the steps. For those who need a little more (as I did): perlpacktut. It's funny, I'm sure we've all read that document numerous times, and yet before this I never noticed the % feature.

    Update: Fixed perlunpacktut: sb perlpacktut.


    Dave

      The summing function is discussed in the Doing Sums section of perlpacktut (not perlunpacktut, which does not exist) and in unpack, although it must be admitted that examples of counted-field summation in both these sources are a bit rare.

      It's funny, I'm sure we've all read that document numerous times, and yet before this I never noticed the % feature.

      I've read it many times, and use the bit-counting form regularly; but always as '%32b*'.

      As soon as I half read AnomalousMonk's post, the significance/simplicity of using a count rather than '*' became immediately obvious to me, and I physically blushed red in the realisation.

      The only factor that slightly lessened my embarrassment was that I was not the only one who missed it. But only slightly :)


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.