Counting bits in large string / bit vector

Peter Otten __peter__ at web.de
Mon Sep 26 05:11:07 EDT 2011


bmacinnis at comcast.net wrote:

> In Perl I can create a large bit vector as follows:

> vec($bitmap,10000000,1) = 0;    # this will create a bit string of all
> zeros

> To set bits I may using commands like:

>      vec($bitmap,1000, 1) = 1          # turn on bit 1000
>      vec($bitmap,10000, 1) = 1        # turn on bit 10000
>      vec($bitmap,1000000, 1) = 1     # turn on bit 10000000

> which would set three bits in the string $bitmap - Note: in perl I don't
> even have to declare $bitmap until I use it in the vec command.
> Anyway there is a very cool perl command which return the number of bits
> set in a large bitmap string instantly.
 
> The command is:

>      $setbits = unpack("%32b*", $bitmap);

> Which in this case would store the number 3 in $setbits

> Is there an equivalent command in python that would immediately provide
> the number of set bits in a large bit vector/string
> I know I could loop through but when you have 10,000,000 or 100,000,000
> bits, the looping takes quite a while the perl unpack is instant.

With numpy:

>>> b = numpy.zeros(10**7, dtype=bool)
>>> for x in 3, 4, 6: b[10**x] = True
...
>>> b.sum()
3

I don't know how it's implemented, but it seems to be quite fast.




More information about the Python-list mailing list