Advertisement
smatskevich

BitSequenceForHuffman

Apr 21st, 2018
420
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.76 KB | None | 0 0
  1. #include <assert.h>
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. class CBitSequence {
  6. public:
  7.     // Дописать бит и байт в конец последовательности.
  8.     void WriteBit( bool bit );
  9.     void WriteByte( char value );
  10.  
  11.     // Читает последовательность.
  12.     char ReadByte();
  13.     bool IsEOS() const { return readIterator == data.size(); }
  14.     // Число бит в последнем байте. 0, если последний байт полностью заполнен.
  15.     int GetLastBitsCount() const { return lastBitsCount; }
  16.  
  17. private:
  18.     std::vector<char> data;
  19.     // Число битов в последнем байте data. От 0 до 7.
  20.     // Если 0, то очередной байт data еще не выделен.
  21.     int lastBitsCount = 0;
  22.     int readIterator = 0;
  23. };
  24.  
  25. void CBitSequence::WriteBit( bool bit )
  26. {
  27.     if( lastBitsCount == 0 ) {
  28.         data.push_back( 0 );
  29.     }
  30.     if( bit ) {
  31.         data.back() |= 1 << lastBitsCount;
  32.     }
  33.     lastBitsCount = ( lastBitsCount + 1 ) % 8;
  34. }
  35.  
  36. void CBitSequence::WriteByte( char value )
  37. {
  38.     // Пишем, начиная с младших битов. Можно эффективнее...
  39.     for( int i = 0; i < 8; ++i ) {
  40.         WriteBit( ( value & ( 1 << i ) ) != 0 );
  41.     }
  42. }
  43.  
  44. char CBitSequence::ReadByte()
  45. {
  46.     assert( readIterator < data.size() );
  47.     return data[readIterator++];
  48. }
  49.  
  50. int main()
  51. {
  52.     CBitSequence sequence;
  53.     sequence.WriteByte( 'a' );
  54.     sequence.WriteBit( true );
  55.     sequence.WriteBit( false );
  56.     sequence.WriteBit( true );
  57.     sequence.WriteBit( true );
  58.     sequence.WriteBit( false );
  59.     sequence.WriteBit( true );
  60.     sequence.WriteByte( 'b' );
  61.  
  62.     while( !sequence.IsEOS() ) {
  63.         std::cout << sequence.ReadByte();
  64.     }
  65.     std::cout << std::endl << sequence.GetLastBitsCount() << std::endl;
  66. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement