<?xml version="1.0" encoding="windows-1252"?>
<node id="1015565" title="Re: Efficient bit counting with a twist." created="2013-01-27 02:23:17" updated="2013-01-27 02:23:17">
<type id="11">
note</type>
<author id="281137">
davido</author>
<data>
<field name="doctext">
&lt;p&gt;I'm hesitant to post this because I haven't had the time to turn an idea into a viable solution (and won't have time tonight).  I haven't tested this against your code or even on a large vector.  It's just an idea that hit me.  Then as I was looking for other ideas on algorithms I came across [http://en.wikipedia.org/wiki/Hamming_weight|Hamming Weight], which mentions this:&lt;/p&gt;
&lt;blockquote&gt;&lt;em&gt;&lt;p&gt;With unlimited memory, we could simply create a large lookup table of the Hamming weight of every 64 bit integer.&lt;/p&gt;&lt;/em&gt;&lt;/blockquote&gt;
&lt;p&gt;Well, obviously we don't have unlimited memory, but using an array as a lookup for 16-bit integers would allow you to count 16 bits at a time rather than a single bit at a time.  So this is a quick rough-draft.  It doesn't take into consideration bit strings that are of lengths that aren't evenly divisible by 16.  It's just an incomplete proof of concept before I go to bed... there's work to be done on it before it's a solution, and of course the work needs to be followed by benchmarks. :)&lt;/p&gt;
&lt;c&gt;
my @lookup;

for( 0 .. 65535 ) {
  my $bits = sprintf "%b", $_;
  my $count = $bits =~ tr/1/1/;
  push @lookup, $count;
}

my $bitstring = '';

vec( $bitstring, 0, 32 ) = 1234567891;

my $count = 0;

for( 0 .. length( $bitstring ) / 2 - 1 ) {
  $count += $lookup[ vec( $bitstring, $_, 16 ) ];
}

print $count, "\n";
&lt;/c&gt;

&lt;div class="pmsig"&gt;&lt;div class="pmsig-281137"&gt;
&lt;br /&gt;&lt;p&gt;Dave&lt;/p&gt;
&lt;/div&gt;&lt;/div&gt;</field>
<field name="root_node">
1015564</field>
<field name="parent_node">
1015564</field>
</data>
</node>
