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

2018-07-20    来源:open-open

容器云强势上线!快速搭建集群,上万Linux镜像随意使用
    #include <iostream>  
    #include <string.h>  
    #define CHAR_BIT 8  
    using 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;  
            else    return 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;  
    }  

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

上一篇:PHP解析 JSON 数据

下一篇:使用使用 imagebrick将pdf转成图片