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

评论