正文

位指针的模拟2006-08-02 20:08:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/sonicling/17128.html

分享到:

struct __bit_ptr{    typedef unsigned char byte;    typedef __bit_ptr bit_type;    byte * pbyte;    int pos;     __bit_ptr() : pbyte(0), pos(0) {}    __bit_ptr(const __bit_ptr& ptr) : pbyte(ptr.pbyte), pos(ptr.pos) {}    bool is_valid() {return pbyte!=0;}    __bit_ptr& operator++ ()    {        if(++pos>=8){ pos=0; pbyte++; }        return *this;    }    __bit_ptr operator++ (int)    {        __bit_ptr bp(*this);        if(++pos>=8){ pos=0; pbyte++; }        return bp;    }    __bit_ptr& operator += (int n)    {        pos += n;        while(pos >= 8){ pos=0; pbyte++; }        return *this;    }    __bit_ptr& operator = (bool set)    {        set_bit(set); return *this;    }    bit_type& operator * ()    {        return *this; // 为了适应*bit_ptr = value的语句    }    operator bool()    {        return is_set(); // 构成*ptr的左值,例如bool set = *bit_ptr;    }    void set_bit(bool set)    {        *pbyte &= ~(byte(1))<<pos; // 对应位置0        *pbyte |= byte(set?1:0)<<pos;    }    bool is_set()    {        return (*pbyte & (byte(1)<<pos)) != 0;    }}; /*将code低bits位写入ptr的位置, 低位先写入*/bool write_bits(__bit_ptr &ptr, unsigned code, int bits){    if(!ptr.is_valid() || bits>sizeof(code)) return false;    for(int i=0; i<bits; i++)    {        *ptr = bool(code & 0x01);        code >>= 1;        ptr++;    }    return true;} /*从ptr读bits位到code,低位先读入*/bool read_bits(__bit_ptr &ptr, unsigned & code, int bits){    if(!ptr.is_valid() || bits>sizeof(code)) return false;    code = 0;    for(int i=0; i<bits; i++)    {        code |= ((*ptr)?1:0) << i;        ptr++;    }    return true;}

阅读(3848) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册