位操作1

本文介绍了一个名为BitBuffer的类的设计与实现,该类能够高效地处理位级别的数据操作,包括位数据的添加与检索。文章详细解释了如何通过位操作技巧来实现这些功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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;
        }
            
};

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值