本文主要介绍C bitset的用法,通过示例代码介绍的非常详细,对大家的学习或工作有一定的参考价值。有需要的朋友下面和边肖一起学习。
C 1bitset在bitset头文件中,是一个类似数组的结构。它的每个元素只能是0或1,每个元素只使用1比特空间。
以下是具体用法。
构造函数
bitset有四种常见的构造函数,如下所示
位集4位集1;//无参数构造,长度为4,每一位默认为0。
位集8位集2(12);//长度为8,二进制存储,前面补0。
字符串s=' 100101
位集10位集3(s);//长度为10,前面补0。
char S2[]=' 10101 ';
位集13位集4(S2);//长度为13,前面补0
cout位集endl//0000
cout位集endl//00001100
cout位集endl//0000100101
cout位集endl//0000000010101
注意:
用字符串构造时,字符串只能包含“0”或“1”,否则将引发异常。
构造时,需要在中指明位集的大小(即size)。
用参数构造时,如果参数的二进制表示小于bitset的大小,就会在前面补上0(如上面的栗子);如果大于bitsize,参数为整数时取后面部分,参数为字符串时取前面部分(比如下面的chestnut):
位集2位集1(12);//12的二进制是1100(长度4),但是bitset1的size=2,只取后半部分,即00。
字符串s=' 100101
位集4位集2(s);//s的size=6,而bitset的size=4,只取前面的部分,也就是1001。
char S2[]=' 11101 ';
位集4位集3(S2);//同bitset2,只取前面部分,即1110。
cout位集endl//00
cout位集endl//1001
cout位集endl//1110
可用的操作符
Bitset有一个用于二进制的位运算符,如下所示
bit set 4 foo(string(' 1001 '));
bitset 4 bar(string(' 0011 '));
cout(foo^=bar)endl;//1010(对bar进行按位异或运算后,将foo赋值给foo)
cout(foo=bar)endl;//0010(按位及之后赋值给foo)
cout(foo |=bar)endl;//0011(按位或之后赋值给foo)
cout(foo=2)endl;//1100(左移2位,低位填0,有自己的赋值)
cout(foo=1)endl;//0110(右移1位,高位填0,有自己的赋值)
cout(~ bar)endl;//1100(位反转)
cout(bar 1)endl;//0110(左移,不赋值)
cout(bar 1)endl;//0001(右移,不赋值)
cout(foo==bar)endl;//false (0110==0011为false)
cout (foo!=bar)endl;//true (0110!=0011为真)
cout(foobar)endl;//0010(按位AND,不赋值)
cout(foo | bar)endl;//0111(按位或,不赋值)
cout(foo^bar)endl;//0101(按位异或,不赋值)
此外,您可以通过[]访问元素(如数组)。请注意,最低位下标为0,如下所示:
bit set 4 foo(' 1011 ');
cout foo[0]endl;//1
cout foo[1]endl;//1
cout foo[2]endl;//0
当然也可以这样给某个元素赋值,栗子就不收起来了。
可用函数
Bitset还支持一些有趣的功能,例如:
bitset 8 foo(' 10011011 ');
cout foo . count()endl;//5(count函数用于查找bitset中1的个数。foo里有5个1。
cout foo . size()endl;//8(size函数用来求bitset的大小,有8位。
cout foo . test(0)endl;//true(测试函数用于检查下标处的元素是0还是1,返回false还是true,其中foo[0]为1,返回true。
cout foo . test(2)endl;//false(同理,foo[2]为0,返回false。
cout foo . any()endl;//true(任意函数检查bitset中是否有1。
cout foo . none()endl;//false(none函数检查bitset中是否没有1。
cout foo . all()endl;//false(all函数检查位集中的全1
注意:测试函数将检查下标是否越界,但是通过[]访问元素将不会通过下标检查。因此,在两种方法通用的情况下,选择测试函数更为安全。
此外,还有一些功能:
bitset 8 foo(' 10011011 ');
cout foo . flip(2)endl;///10011111(flip当flip函数传递参数时,用来对参数位取反。这一行代码把foo下标2‘反转’了,也就是0变1,1变0。
cout foo . flip()endl;//01100000(当flip函数不指定参数时,反转bitset的每一位。
cout foo . set()endl;//11111111(当set函数没有指定参数时,将bitset的所有位设置为1。
cout foo.set(3,0)endl;//11110111(当set函数指定两位参数时,将第一个参数位的元素设置为第二个参数的值。这一行中对foo的操作相当于foo[3]=0。
cout foo . set(3)endl;//11111111(当设置的函数只有一个参数时,将参数下标视为1。
cout foo . reset(4)endl;//1101111(当reset函数传递一个参数时,参数下标被视为0。
cout foo . reset()endl;///00000000(reset reset函数不传递参数,bitset的所有位都设置为0。
同样,它们都检查下标是否越界,如果越界就抛出异常。
最后,还有一些类型转换的函数,如下所示:
bitset 8 foo(' 10011011 ');
string s=foo . to _ string();//将位集转换为字符串类型
无符号长整型a=foo . to _ ulong();//将位集转换为无符号长整型
无符号long long b=foo . to _ ullong();//将位集转换为无符号long long类型
cout s endl//10011011
cout a endl//155
cout b endl//155
以上是边肖介绍的C bitset用法的详细讲解和集成。希望对你有帮助。如果您有任何问题,请给我留言,边肖将及时回复您。非常感谢您对我们网站的支持!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。