Boost logo

Boost :

Subject: [boost] subbitset
From: Andreas Klein (klein_at_[hidden])
Date: 2008-11-19 06:19:15


Hello.

I am using your dynamic_bitset and I encountered the following problem.

I have realy large bits sets (>100000) bits. At some point I need do
some xor Operations on only a small fraction of the bits. So I need a
way to access the bits from index n to n+s-1. The bitclass has no
convient way to do this.

I suggest add the member function sub_bitset for that purpose.

Example:

a = 100000101101101001110101
                   ^^^^^^^
a.subbitset(3,7)
b = 1001110

(The ^^^^^^^ marks the position of b in a).

I implemented subbitset as follows:

template<typename B, typename A>
dynamic_bitset<B, A>
dynamic_bitset<B, A>::subbitset(size_type n,size_type s) const
{
   assert(n+s < size());
   dynamic_bitset res(s);
   size_type const last = res.num_blocks() - 1; // num_blocks() is >= 1
   size_type const last2 = num_blocks() - 1;
   size_type const div = n / bits_per_block; // div is <= last
   block_width_type const r = bit_index(n);
   const block_type * const b = &m_bits[0];
   block_type * const bb = &res.m_bits[0];

   if (r != 0) {

     block_width_type const ls = bits_per_block - r;

     for (size_type i = 0; i <= last; ++i) {
       if (div+i+1 >last2) { // Do we reach the last block?
         bb[i] = (b[div+i] >> r);
         break;
       }
       bb[i] = (b[div+i] >> r) | (b[div+i+1] << ls);
     }
   }

   else {
     for (size_type i = 0; i <= last; ++i) {
       if (i+div>last2) // Do we reach the last block?
         break;
       bb[i] = b[i+div];
     }
     // note the '<=': the last iteration 'absorbs'
     // b[last-div] = b[last] >> 0;
   }

   // Zero unused bits
   block_width_type const rr = bit_index(s);
   if(rr != 0)
     bb[last] &= (1<<(block_type)(rr))-1;

   return res;
}

I guess, that I am not the only one who would benefit from the
possibility to access subbitsets. I could also imagine that references
to subbitsets could be of some use. Foe example I could imagine that
one would use subbitset as follows.

a= 00000000
b= 111
a.subbit(2,3) ^= b;

-> a=00011100

But such a reference would be harder to implement and at the moment I
do not need it.

What do you think? Is there any hope for subbitset in boost?

Best wishes
      Andreas Klein.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk