smatskevich

BitSequenceForHuffman

Apr 21st, 2018
219
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data

Adblocker detected! Please consider disabling it...

We've detected AdBlock Plus or some other adblocking software preventing Pastebin.com from fully loading.

We don't have any obnoxious sound, or popup ads, we actively block these annoying types of ads!

Please add Pastebin.com to your ad blocker whitelist or disable your adblocking software.

×