#include<vector>
#include<limits>
using namespace std;
int min(int a,int b)
{
return a < b ? a : b;
}
class BitBuffer
{
public:
BitBuffer():m_buf(0),m_size(0){}
//添加p所指的位缓冲区头部的num个位
void Append(unsigned char* p,size_t num)
{
int bits = numeric_limits<unsigned char>::digits;
//
int dst = m_size / bits;
int off = m_size % bits;
//扩充
while(m_buf.size() < (m_size + num) / bits + 1)
m_buf.push_back(0);
for(int i = 0;i < (num + bits - 1) / bits; ++i)
{
unsigned char mask = FirstBits(num - bits * i);
m_buf[dst + i] |= (*(p + i)& mask) >> off;
if(off > 0)
m_buf[dst+i+1] = (*(p+i) & mask) << (bits-off);
}
m_size += num;
}
//查询正被使用的位数目(初始化为0)
size_t Size() const
{
return m_size;
}
//从第start位(位的编号从0开始)开始获取num个位,并将结果存入dst所指的缓冲区中(从缓冲区的第一位开始存放)
//dst 所指的缓冲区除了能放下num位之外至少还要多出一个字节
void Get(size_t start,size_t num,unsigned char* dst) const
{
int bits = numeric_limits<unsigned char>::digits;
int src = start / bits;
int off = start % bits;
for(int i = 0;i < (num+bits-1) / bits;++i)
{
*(dst+i) = m_buf[src+i] <<off;
if(off > 0)
*(dst+i) |= m_buf[src+i+1] >>(bits - off);
}
}
private:
vector<unsigned char> m_buf;
size_t m_size;
//创建一个前n位为1,剩余位为0的掩码
unsigned char FirstBits(size_t n)
{
int num = min(n,numeric_limits<unsigned char>::digits);
unsigned char b = 0;
while(num-- > 0)
b = (b >> 1) | (1 << (numeric_limits<unsigned char>::digits - 1));
return b;
}
};