当我们遇到这样一种情况:
输入n串二进制数
然后对这些二进制数进行一些位运算
再以二进制输出
一般我们会想到用字符串输入这些二进制数然后转存进int或者long long进行位运算
最后再写一个输出二进制的函数用来输出
乍一看,难度不大,码量也还行
但是也没有一种数据结构能够直接存储二进制数呢
答案肯定是有的不然我BB半天是为了什么
bitset是C++自带的用来储存二进制数的一种数据结构(在bitset头文件中)
它的好处是能够直接用来读入二进制数和进行位运算但是不能读二进制以上的数
并且int类型和bool类型可以转换为bitset(long long之类的整型也可以)但是字符数组依然不行
bitset还有一个好处就是空间小,一个元素只占1bit,只有char的1/8大
bitset中的每一个元素都可以被单独访问,但是不能被单独读入或读出
bitset还自带了一些函数(如果有遗漏请指出):
bitset <10> s;
s.any(); //返回在bitset中是否存在1(即bitset存储的二进制数是否不为0)
s.set(); //将bitset所有的元素全部变为1
s.set(p); //将bitset的第p+1个元素变为1
s.set(p, x); //将bitset的第p+1个元素变为x(x为1或0)
s.flip(); //将bitset中所有的元素全部取反
s.flip(p); //将第p+1个元素取反
s.size(); //返回bitset的大小(即有多少位数)
s.none(); //返回在bitset中是否不存在1(即bitset储存的二进制数是否为0)
s.count(); //返回在bitset中1的个数
s.reset(); //将bitset中所有的元素全部变为0(即将bitset清空)
s.reset(p); //将bitset的第p+1个元素变为0
s.to_ulong(); //返回bitset转换为unsigned long的结果,如果超出范围则会报错
s.to_ullong(); //返回bitset转换为unsigned long long的结果,如果超出范围则会报错
s.to_string(); //返回bitset转换为string的结果
bitset还可以直接运用位运算(和整型一样,这里就不展示了)
bitset在方便的同时,也有一些不方便的地方
就比如输出,虽然bitset可以直接输出
但是输出的二进制位数和bitset定义的长度一样
也就是说直接输出bitset时可能会在我们所需要的答案前输出一堆0
所以我们还是得写一个输出的函数
虽然int型和bool型可以转换成bitset型,但是整个bitset型不能转换为int型,只能单独一个元素转换成int型
所以用bitset转换为int型得用一个for循环
同时一个bitset与另一个bitset之间不能直接运用加减乘除之类的运算,只能直接赋值
讲完了
如果您有不同的见解,或者说发现了什么错误的地方,欢迎指出