C++中bitset的实现(引用类的使用)

#include <iostream>#include <string.h>#define CHAR_BIT 8using namespace std;template<size_t _N>class bitset{typedef unsigned long _Ty; friend ostream & operator << (ostream &_O,const bitset<_N> &_R){for(size_t _P=_N;_P>0;)_O<<(_R.test(–_P)?'1':'0');return _O;}public:class reference{public:friend class bitset<_N>;reference &operator=(bool _X){_Pbs->set(_Off,_X);return *this;}reference& operator=(const reference &_Bs){_Pbs=_Bs._Pbs;_Off=_Bs._Off;return *this;}operator bool()const{return _Pbs->test(_Off-1);}bool operator~()const{_Pbs->flip(_Off);}bool operator &(const reference &_Bs){return (_Pbs->test(_Off-1)&_Bs._Pbs->test(_Bs._Off-1));}private:reference(bitset<_N> *_X,size_t _P):_Pbs(_X),_Off(_P){}bitset<_N> *_Pbs;size_t _Off;};bool at(size_t _P)const { return test(_P); }bool operator[](size_t _P)const{return test(_P);}reference operator[](size_t _P){return reference(this,_P);}bitset(){_Tidy();}bitset(const string &_S){_Tidy();int _I=0;while(_S[_I]!='\0'){int _D = _S[_I]=='1'?1:0;_I++;set(_I,_D);}}bitset(int x){_Tidy();_A[0]|=(_Ty)x;}bitset(const string &_S,int _X){_Tidy();int _I=0;while(_S[_I]!='\0'){int _D = _S[_I]=='1'?1:0;_I++;set(_I,_D);}set(_X,1);} bitset<_N>& set(){_Tidy(~(_Ty)0);return *this;}bitset<_N>& set(size_t _P, bool _X = true){if(_X) _A[_P/_Nb] |= ((_Ty)0x1<<(_P%(_N+1))-1);else{_A[_P/_Nb] &= ~((_Ty)0x1<<(_P%(_N+1))-1);}return *this;}bitset<_N>& reset(){_Tidy();return *this;}bitset<_N>& reset(size_t _P){set(_P,0);return *this;}bitset<_N>& flip(){for(int _I=0;_I<=_Nw;_I++){_A[_I]^=(~(_Ty)0x0);}_Trim();}bitset<_N>& flip(size_t _P){_A[_P/_Nb] ^= ((_Ty)0x1<<(_P%(_Nb+1)-1));return *this;}size_t size()const{return _N;}size_t count()const{ size_t _V=0;for(int _I=_Nw;_I>=0;–_I)for(_Ty _X=_A[_I];_X!=0;_X>>=4)_V+="\0\1\1\2\1\2\2\3\1\2\2\3\2\3\3\4"[0xff&_X];return _V;}bitset<_N> operator~(){for(int _I=0;_I<=_Nw;++_I)_A[_I]=~_A[_I];_Trim();return *this;}unsigned long to_ulong() const{enum{_Assertion=1/(sizeof(unsigned long)%sizeof(_Ty)==0)};int _I = _Nw;for(;sizeof(unsigned long)/sizeof(_Ty)<=_I;–_I)if(_A[_I]!=0)break;unsigned long _V=_A[_I];for(;0<=–_I;)_V=_V<<_Nb|_A[_I];return (_V);}string to_string()const{string _S;for(int _I=0;_I<=_Nw;_I++){for(int _X=_A[_I];_X!=0;){_S+=((_X&((_Ty)0x1))==1?"1":"0");_X>>=1;}}return _S;}bool any()const{for(int _I=0;_I<=_Nw;++_I)if(_A[_I]!=0)return true;elsereturn false;}bool none()const{return !any();}bitset<_N>& operator&=(const bitset<_N> &_R){for(int _I=0;_I<=_Nw;_I++)_A[_I]&=_R._A[_I];return *this;}bitset<_N>& operator|=(const bitset<_N> &_R){for(int _I=0;_I<=_Nw;_I++)_A[_I]|=_R._A[_I];return *this;}bitset<_N>& operator^=(const bitset<_N> &_R){for(int _I=0;_I<=_Nw;_I++)_A[_I]^=_R._A[_I];return *this;}friend bitset<_N> operator&(const bitset<_N> &_L, const bitset<_N> &_R){return (bitset<_N>(_L)&=_R);}friend bitset<_N> operator|(const bitset<_N> &_L, const bitset<_N> &_R){return (bitset<_N>(_L)|=_R);}friend bitset<_N> operator^(const bitset<_N> &_L, const bitset<_N> &_R){return (bitset<_N>(_L)^=_R);}bitset<_N>& operator<<=(size_t _P){int _D = _P/_Nb;if(_D!=0){int _I;for( _I=_Nw;_I>0;_I–){_A[_I] = _D<=_I?_A[_I-_D]:0;}for(int _J=0;_J<_D-1;_J++)_A[_J] = 0;}if(_P%_Nb!=0){int _I = _Nw;for(;_I>0;–_I){_A[_I]=(_A[_I]<<(_P%_Nb))|(_A[_I-1]>>(_Nb-_P%_Nb));}}_A[0]<<=(_P%_Nb);_Trim();return *this;}bitset<_N>& operator>>=(size_t _P){int _D = _P/_Nb;if(_D!=0){int _I;for(_I=0;_I<=_Nw;_I++){_A[_I] = _I+_D<=_Nw?_A[_I+_D]:0;}for(int _J=0;_J<_D;_J++)_A[_Nw-_J]=0;}if(_P%_Nb!=0){int _I = 0;for(;_I<_Nw;++_I){_A[_I]=(_A[_I]>>(_P%_Nb))|(_A[_I+1]<<(_Nb-_P%_Nb));}}_A[_Nw]>>=(_P%_Nb);_Trim();return *this;}friend bitset<_N> operator<<(const bitset<_N> &_L, size_t _P){return bitset<_N>(_L)<<=_P;}friend bitset<_N> operator>>(const bitset<_N> &_L,size_t _P){return bitset<_N>(_L)>>=_P;}private:bool test(size_t _P)const{return (((_A[_P/_Nb]) & (0x1<<(_P%_Nb)))!=0);}void _Tidy(_Ty _X=0){for(int _I=_Nw;_I>=0;–_I)_A[_I]=_X; if(_X!=0)_Trim();}void _Trim(){if(_N%_Nb!=0)_A[_Nw]&=(((_Ty)0x1<<_N%_Nb)-1);}enum{_Nb=CHAR_BIT*sizeof(_Ty),_Nw = _N==0?0:(_N-1)/_Nb,};_Ty _A[_Nw+1];};int main(){bitset<10> bt1;bt1[2]=1;bitset<10> bt2;bt2[2]=1;cout<<(bt1[2]&bt2[2])<<endl;return 0;}

,要愈合不能,要忘却不能,要再次拥抱,却鼓不起足够的勇气,

C++中bitset的实现(引用类的使用)

相关文章:

你感兴趣的文章:

标签云: