Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <assert.h>
- #include <iostream>
- #include <vector>
- class CBitSequence {
- public:
- // Дописать бит и байт в конец последовательности.
- void WriteBit( bool bit );
- void WriteByte( char value );
- // Читает последовательность.
- char ReadByte();
- bool IsEOS() const { return readIterator == data.size(); }
- // Число бит в последнем байте. 0, если последний байт полностью заполнен.
- int GetLastBitsCount() const { return lastBitsCount; }
- private:
- std::vector<char> data;
- // Число битов в последнем байте data. От 0 до 7.
- // Если 0, то очередной байт data еще не выделен.
- int lastBitsCount = 0;
- int readIterator = 0;
- };
- void CBitSequence::WriteBit( bool bit )
- {
- if( lastBitsCount == 0 ) {
- data.push_back( 0 );
- }
- if( bit ) {
- data.back() |= 1 << lastBitsCount;
- }
- lastBitsCount = ( lastBitsCount + 1 ) % 8;
- }
- void CBitSequence::WriteByte( char value )
- {
- // Пишем, начиная с младших битов. Можно эффективнее...
- for( int i = 0; i < 8; ++i ) {
- WriteBit( ( value & ( 1 << i ) ) != 0 );
- }
- }
- char CBitSequence::ReadByte()
- {
- assert( readIterator < data.size() );
- return data[readIterator++];
- }
- int main()
- {
- CBitSequence sequence;
- sequence.WriteByte( 'a' );
- sequence.WriteBit( true );
- sequence.WriteBit( false );
- sequence.WriteBit( true );
- sequence.WriteBit( true );
- sequence.WriteBit( false );
- sequence.WriteBit( true );
- sequence.WriteByte( 'b' );
- while( !sequence.IsEOS() ) {
- std::cout << sequence.ReadByte();
- }
- std::cout << std::endl << sequence.GetLastBitsCount() << std::endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement