bitset
代替整型进行位运算,更方便并且可以处理超过最大整形范围大小的位集合。
你可以把bitset看作可以位运算的bool数组,换言之,bitset的大小是固定的。因此,用bitset做状态压缩是很方便的,也可以方便的实现集合的交并补操作。
bitset仅重载了相等不等和位运算符,原生不支持四则运算和大小比较,所以很少代替高精度数。
bitset<N> b(unsigned long long u=0);//用u的低N位初始化b,N是一个可转成ULL类型的常量表达式,高位补0
bitset<N> b(string s,int pos,int m=string::npos,char zero='0',char one='1');//用s从pos位开始的m位初始化b,s中只含zero和one
b.size();//b的大小,即N
b.count();//b中1的个数
b[pos];//b中pos位的引用
b.set();//b全赋1
b.reset();//b全赋0
b.flip();//b全反转
b.to_ull();//b转成unsigned long long,b.size()>64时出错
b.to_string(char zero='0',char one='1');//按参数输出字符串
os<<b;//按'0'和'1'打印b
is>>b;//按'0'和'1'读入b,当下一个字符不是'0'或'1'或读到b.size()个数后停止
==、!=、<<、>>、&、|、^//保持它们在整型运算中的含义
大小比较
其他运算符类似。
typedef bitset<127> Bint;
bool operator!=(const Bint &a,const Bint &b)
{
for(int i=a.size()-1; ~i; --i)
if(a[i]!=b[i])return 1;
return 0;
}
bool operator<(const Bint &a,const Bint &b)
{
for(int i=a.size()-1; ~i; --i)
if(a[i]!=b[i])return a[i]<b[i];
return 0;
}
加法
Bint operator+(const Bint &a,const Bint &b)
{
return b.any()?(a^b)+((a&b)<<1):a;
}
Bint& operator+=(Bint &a,const Bint &b)
{
return a=a+b;
}
减法
Bint operator-(const Bint &a)
{
return Bint(1)+~a;
}
Bint& operator-=(Bint &a,const Bint &b)
{
return a+=-b;
}
Bint operator-(Bint a,const Bint &b)
{
return a-=b;
}
乘法
Bint operator*(Bint a,Bint b)
{
Bint r(0);
for(; b.any(); b>>=1,a+=a)if(b[0])r+=a;
return r;
}
Bint& operator*=(Bint &a,const Bint &b)
{
return a=a*b;
}
整除、取模
Bint operator%=(Bint ÷nd,const Bint &divisor)
{
if(dividend<divisor||divisor.none())return dividend;
Bint c,res=0;
for(int k; divisor<dividend;)
{
for(k=0,c=divisor; !(dividend<c); c<<=1,++k)
if(dividend<divisor+c)
{
res+=1<<k;
break;
}
if(dividend<divisor+c)break;
res+=1<<(k-1);
dividend-=c>>1;
}
return dividend;//res是商
}
输入输出
bitset
已经原生重载了输入输出运算符,避免歧义。
istream& getb(istream &is,Bint &val)
{
int sign=1,ch=is.get();
for(; !isdigit(ch)&&ch!=EOF; ch=is.get())
if(ch=='-')
sign=-sign;
for(val=0; isdigit(ch); ch=is.get())
val=(val<<3)+(val<<1)+(ch^'0');
if(sign==-1)val=-val;
return is.putback(ch);
}
ostream& putb(ostream &os,const Bint &val)
{
if(Bint(9)<val)putb(os,val/10);
return os.put(val.to_ulong()%10+'0');
}