Advertisement
smatskevich

Haffman

Dec 17th, 2021
794
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.11 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. // Найти степень двойки, не превосходящей n
  4. int MaxPower(int n) {
  5.   int power = 1;
  6.   while (power <= n) {
  7.     power <<= 1;
  8.   }
  9.   return power >> 1;
  10. }
  11.  
  12. int MaxPower2(int n) {
  13.   int power = 1;
  14.   while (n > 1) {
  15.     n >>= 1;
  16.     power <<= 1;
  17.   }
  18.   return power;
  19. }
  20.  
  21. int MaxPower3(int n) {
  22.   int power = 1;
  23.   while (n > 0) {
  24.     power <<= 1;
  25.     n >>= 1;
  26.   }
  27.   return power >> 1;
  28. }
  29.  
  30.  
  31.  
  32.  
  33. typedef char byte;
  34.  
  35. struct IInputStream {
  36.   // Возвращает false, если поток закончился
  37.   virtual bool Read(byte& value) = 0;
  38. };
  39.  
  40. struct IOutputStream {
  41.   virtual void Write(byte value) = 0;
  42. };
  43.  
  44. class OutputStream : public IOutputStream {
  45.  public:
  46.   void Write(byte value) override { std::cout << value; }
  47. };
  48.  
  49.  
  50. class BitWriter {
  51.  public:
  52.   explicit BitWriter(IOutputStream& out_stream) : out_stream_(out_stream) {}
  53.  
  54.   void WriteBit(bool bit);
  55.   void WriteByte(byte b);
  56.  
  57.  private:
  58.   IOutputStream& out_stream_;
  59.   byte buffer = 0;
  60.   int buffer_length = 0;  // От 0 до 7.
  61. };
  62.  
  63. void BitWriter::WriteBit(bool bit) {
  64.   // Закинем бит в буфер.
  65.   buffer = (bit ? 1 : 0) << (7 - buffer_length);
  66.   ++buffer_length;
  67.   // Если буфер заполнился (его длина стала равна 8), то сбрасываем в out_stream.
  68.   if (buffer_length == 8) {
  69.     out_stream_.Write(buffer);
  70.     buffer = 0;
  71.     buffer_length = 0;
  72.   }
  73. }
  74. void BitWriter::WriteByte(byte b) {
  75.   // Если буфер пуст, то сразу сбрасываем b в out_stream.
  76.   if (buffer_length == 0) {
  77.     out_stream_.Write(b);
  78.     return;
  79.   }
  80.   // Иначе: Дополняем buffer первой частью b.
  81.   // 00000|101 -> 101|00000 -> 101|bbbbb
  82.   int first_part_length = 8 - buffer_length;
  83.   buffer <<= 8 - buffer_length;
  84.   buffer += b >> buffer_length;
  85.   // Скидываем в out_stream.
  86.   out_stream_.Write(buffer);
  87.   // Вторую часть b кладем в buffer. bbb|00000
  88.   buffer = b << (8 - buffer_length);
  89. }
  90.  
  91. void Encode(IInputStream& original, IOutputStream& compressed);
  92. void Decode(IInputStream& compressed, IOutputStream& original);
  93.  
  94.  
  95. int main() {
  96. //  int n = 0;
  97. //  std::cin >> n;
  98. //  std::cout << MaxPower(n) << std::endl;
  99. //  std::cout << MaxPower2(n) << std::endl;
  100. //  std::cout << MaxPower3(n) << std::endl;
  101.   OutputStream output;
  102.   BitWriter bit_writer(output);
  103.   // Пишем дерево 10a110b10c0d0r.
  104.   bit_writer.WriteBit(true);
  105.   bit_writer.WriteBit(false);
  106.   bit_writer.WriteByte('a');
  107.   bit_writer.WriteBit(true);
  108.   bit_writer.WriteBit(true);
  109.   bit_writer.WriteBit(false);
  110.   bit_writer.WriteByte('b');
  111.   bit_writer.WriteBit(true);
  112.   bit_writer.WriteBit(false);
  113.   bit_writer.WriteByte('c');
  114.   bit_writer.WriteBit(false);
  115.   bit_writer.WriteByte('d');
  116.   bit_writer.WriteBit(false);
  117.   bit_writer.WriteByte('r');
  118.   // Нужно финализировать – последний буфер скинуть в byte.
  119.   // Можно отдельно записать число неиспользуемых бит в потоке.
  120.   return 0;
  121. }
  122.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement