[dynamic_bitset] Append byte to the less significant end

Hi, Here is my problem: i am using boost::dynamic_bitset and I would like to append a byte to the bitset. The idea is the following: 1) read a byte (represented as an unsigned char) 2) append the byte to the bitset 3) repeat these steps until there is no more data to read The current "append" in the API appends a byte to the most significant end. I would like to actually append the byte to the less significant end. The only solution that I have found so far is to concatenate two bitsets: http://pastebin.com/cguqaMgS I am not sure this is a very efficient way. Do you have any other suggestions? Thank you for your help and Merry Christmas. Romain

Merry Christmas, Romain :) 2010/12/24 Romain CHANU <romainchanu@gmail.com>:
Here is my problem: i am using boost::dynamic_bitset and I would like to append a byte to the bitset.
The idea is the following:
1) read a byte (represented as an unsigned char) 2) append the byte to the bitset 3) repeat these steps until there is no more data to read
The current "append" in the API appends a byte to the most significant end. I would like to actually append the byte to the less significant end.
I think you are trying to use the data structure, dynamic_bitset in a way that it was not designed for. Class templates bitset and dynamic_bitset are ususally interpreted in two ways. (1) As sets of elements, represented by bits. (2) As a binary number with binary digits starting from the least to the most significant bit. Of the two concepts, set and binary number, the set concept is the more important one. It gives the class template its name: bit*set*. The operation that you are intending to apply is not a simple append of elements, because it always changes the whole set. All elements that are in the set already have to be added a value of 8. Then you are setting some of the first 8 values from your new byte. Dynamic_bitset::append does not alter the elements in the the bitset and cheaply adds a new block, containing some new elements, at the end. I'd say you could collect your single bytes (bitsets) in a vector, appending them at the end with push_back and then populate a dynamic_bitset in reverse order using BlockIterators. As an alternative to dynamic_bitsets you could also use icl::interval_bitsets form the extended Interval Container Library ICL+. Class template icl::interval_bitset can represent very lare bitsets in a compact form because it uses a combination of interval compression and bit compression. You can find examples and an introductory implementation here: http://www.joachim-faulhaber.de/boost_icl/doc/libs/icl/doc/html/boost_icl/pr... Note, that icl::interval_bitset is not yet a part of the Interval Container Library [Boost.Icl] that will be available with the next Boost release 1.46. But you can download ICL+ from sourceforge: http://sourceforge.net/projects/itl/ or get a copy via SVN from the sandbox https://svn.boost.org/svn/boost/sandbox/icl/ I am planning to add icl::interval_bitsets to the core library [Boost.Icl] next and will also add functions for the addition/deletion of blocks (elementary bitsets). HTH Joachim -- Interval Container Library [Boost.Icl] http://www.joachim-faulhaber.de

Hey Joachim, Thank you for your help and advices. I did use the reverse iterators and it works like a charm. In my case, the bitsets are not really huge so ICL may not be suitable. But it is good to know :-) Cheers, Romain On 24 December 2010 23:00, Joachim Faulhaber <afojgo@googlemail.com> wrote:
Merry Christmas, Romain :)
2010/12/24 Romain CHANU <romainchanu@gmail.com>:
Here is my problem: i am using boost::dynamic_bitset and I would like to append a byte to the bitset.
The idea is the following:
1) read a byte (represented as an unsigned char) 2) append the byte to the bitset 3) repeat these steps until there is no more data to read
The current "append" in the API appends a byte to the most significant end. I would like to actually append the byte to the less significant end.
I think you are trying to use the data structure, dynamic_bitset in a way that it was not designed for. Class templates bitset and dynamic_bitset are ususally interpreted in two ways.
(1) As sets of elements, represented by bits. (2) As a binary number with binary digits starting from the least to the most significant bit.
Of the two concepts, set and binary number, the set concept is the more important one. It gives the class template its name: bit*set*. The operation that you are intending to apply is not a simple append of elements, because it always changes the whole set. All elements that are in the set already have to be added a value of 8. Then you are setting some of the first 8 values from your new byte. Dynamic_bitset::append does not alter the elements in the the bitset and cheaply adds a new block, containing some new elements, at the end.
I'd say you could collect your single bytes (bitsets) in a vector, appending them at the end with push_back and then populate a dynamic_bitset in reverse order using BlockIterators.
As an alternative to dynamic_bitsets you could also use icl::interval_bitsets form the extended Interval Container Library ICL+. Class template icl::interval_bitset can represent very lare bitsets in a compact form because it uses a combination of interval compression and bit compression. You can find examples and an introductory implementation here:
http://www.joachim-faulhaber.de/boost_icl/doc/libs/icl/doc/html/boost_icl/pr...
Note, that icl::interval_bitset is not yet a part of the Interval Container Library [Boost.Icl] that will be available with the next Boost release 1.46. But you can download ICL+ from sourceforge:
http://sourceforge.net/projects/itl/
or get a copy via SVN from the sandbox
https://svn.boost.org/svn/boost/sandbox/icl/
I am planning to add icl::interval_bitsets to the core library [Boost.Icl] next and will also add functions for the addition/deletion of blocks (elementary bitsets).
HTH Joachim
-- Interval Container Library [Boost.Icl] http://www.joachim-faulhaber.de _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
participants (2)
-
Joachim Faulhaber
-
Romain CHANU