标签:
#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:
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)//相应位置置1
{
_Tidy();
_A[0]|=(_Ty)x;
}
bitset(const string &_S,int _X)//字符串相应位置置1
{
_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()//置1
{
_Tidy(~(_Ty)0);
return *this;
}
bitset<_N>& set(size_t _P, bool _X = true)//相应位置置1
{
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()//所有位置0
{
_Tidy();
return *this;
}
bitset<_N>& reset(size_t _P)//相应位置置0
{
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//求1的个数
{
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//转换为long型
{
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类型
{
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//位域中出现一个1就返回真
{
for(int _I=0;_I<=_Nw;++_I)
if(_A[_I]!=0)
return true;
else return false;
}
bool none()const//位域中没有一个1就返回真
{
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(15);
cout<<bt1<<endl;
bt1.flip();
cout<<bt1<<endl;
return 0;
}<<=与<<不一样,<<不能改变原来的值,所以在这里需要拷贝,避免在原来的参数上进行修改。标签:
原文地址:http://blog.csdn.net/liuhuiyan_2014/article/details/44919985