bit_res.cpp
上传用户:hxb_1234
上传日期:2010-03-30
资源大小:8328k
文件大小:2k
源码类别:

VC书籍

开发平台:

Visual C++

  1. /* bit_res.cpp
  2. Implementation of Bit Reservoir for Layer III
  3.    Adapted from the public c code by Jeff Tsay. */
  4. #include "all.h"
  5. #include "bit_res.h"
  6. Bit_Reserve::Bit_Reserve()
  7. {
  8. uint32 shifted_one = 1;
  9. offset       = 0;
  10.    totbit  = 0;
  11.    buf_byte_idx = 0;
  12. buf          = new uint32[BUFSIZE];
  13. buf_bit_idx  = 8;
  14. putmask      = new uint32[32];
  15.    putmask[0] = 0;
  16.    for (int32 i=1; i<32; i++)
  17.    {
  18.     putmask[i] = putmask[i-1] + shifted_one;
  19.       shifted_one <<= 1;
  20.    }
  21. }
  22. Bit_Reserve::~Bit_Reserve ()
  23. {
  24. delete [] putmask;
  25. delete [] buf;
  26. }
  27. uint32 Bit_Reserve::hgetbits(uint32 N)
  28. // read N bits from the bit stream
  29. {
  30.    totbit += N;
  31.    uint32 val = 0;
  32.    int32 j = N;
  33.    while (j > 0) {
  34.   if (buf_bit_idx == 0) {
  35.       buf_bit_idx = 8;
  36.      buf_byte_idx++;
  37. /* if (buf_byte_idx > offset)
  38.   { printf("Buffer overflow !!n");exit(3); } */
  39.      }
  40.   int32 k = (j < buf_bit_idx) ? j : buf_bit_idx;
  41.    // BUFSIZE = 4096 = 2^12, so
  42.    // buf_byte_idx%BUFSIZE == buf_byte_idx & 0xfff
  43.      int32 tmp = buf[buf_byte_idx & 0xfff] & putmask[buf_bit_idx];
  44.      buf_bit_idx -= k;
  45.   tmp = tmp >> buf_bit_idx;
  46.      j -=k;
  47.      val |= tmp << j;
  48.    }
  49.    return val;
  50. }
  51. uint32 Bit_Reserve::hget1bit()
  52. // read 1 bit from the bit stream
  53. {
  54.    uint32 val;
  55.    totbit++;
  56. if (buf_bit_idx == 0) {
  57.      buf_bit_idx = 8;
  58.   buf_byte_idx++;
  59.    }
  60.    // BUFSIZE = 4096 = 2^12, so
  61.    // buf_byte_idx%BUFSIZE == buf_byte_idx & 0xfff
  62.    val = buf[buf_byte_idx & 0xfff] & putmask[buf_bit_idx];
  63.    buf_bit_idx--;
  64. val = val >> buf_bit_idx;
  65.    return val;
  66. }
  67. void Bit_Reserve::hputbuf(int32 val)
  68. // write 8 bits into the bit stream
  69. {
  70.    buf[offset] = val;
  71.    offset = (offset + 1) & 0xfff;
  72. }
  73. void Bit_Reserve::rewindNbits(int32 N)
  74. {
  75. totbit -= N;
  76. buf_bit_idx += N;
  77. while(buf_bit_idx >= 8) {
  78.     buf_bit_idx -= 8;
  79. buf_byte_idx--;
  80. }
  81. }
  82. void Bit_Reserve::rewindNbytes(int32 N)
  83. {
  84.    totbit -= (N << 3);
  85. buf_byte_idx -= N;
  86. }