赞
踩
这一篇文章系统的学习一下std标准库中的容器bitset,一个bitset是用来储存诸多bit,这些元素可以用来表示两种状态:0或1,true或false…。所以有一些时候可以很方便的用该容器快速实现状态储存。
该容器通过对空间的特殊优化,使得该容器对状态的储存空间非常小,相当于将若干状态储存在一个个bit上。该容器的元素访问也可以通过[n]访问容器中第n个元素,但是由于一般语言没有一个bit大小的数据类型,所以这里使用了一种特殊的引用类型访问,如:bitset::reference。
#include <bitset>
bitset::bitset
构造一个bitset,方法如下所示:
// constructing bitsets #include <iostream> // std::cout #include <string> // std::string #include <bitset> // std::bitset int main () { std::bitset<16> foo; std::bitset<16> bar (0xfa2); std::bitset<16> baz (std::string(“0101111001”)); std::cout << "foo: " << foo << ‘\n’; std::cout << "bar: " << bar << ‘\n’; std::cout << "baz: " << baz << ‘\n’; return 0; //Output: //foo: 0000000000000000 //bar: 0000111110100010 //baz: 0000000101111001 }
总的来说,有四种方法构造一个bitset,可参考:bitset基础用法+心得。
Tables | Are |
---|---|
bitset< n > b; | 创建一个初始值均为0的n位bitset b |
bitset< n > b(u); | 根据unsigned long数u创建一个bitset b |
bitset< n > b(s); | 根据string s中含有位数的情况创建一个bitset b |
bitset< n > b(s, pos, n); | 根据string s中创建pos位置开始n个元素的bitset b |
1.bitset::operator[]
访问一个bit元素,返回bool类型的值或者对该元素的引用reference。示例代码如下:
// bitset::operator[] #include <iostream> // std::cout #include <bitset> // std::bitset int main () { std::bitset<4> foo; foo[1]=1; // 0010 foo[2]=foo[1]; // 0110 std::cout << "foo: " << foo << ‘\n’; return 0; } //Output: //foo: 0110
2.bitset::count()
统计bitset中被设置的bits的个数,也就是bitset中值为1的元素个数。对于要求bitset中元素总个数,可以参考:比他set::size()。示例代码如下:
// bitset::count #include <iostream> // std::cout #include <string> // std::string #include <bitset> // std::bitset int main () { std::bitset<8> foo (std::string(“10110011”)); std::cout << foo << " has “; std::cout << foo.count() << ” ones and “; std::cout << (foo.size()-foo.count()) << ” zeros.\n"; return 0; } //Output: //10110011 has 5 ones and 3 zeros.
3.bitset::size()
返回bitset中元素总个数。即通常意义上bitset的大小。示例代码如下:
// bitset::size #include <iostream> // std::cout #include <bitset> // std::bitset int main () { std::bitset<8> foo; std::bitset<4> bar; std::cout << "foo.size() is " << foo.size() << ‘\n’; std::cout << "bar.size() is " << bar.size() << ‘\n’; return 0; } //Output: //foo.size() is 8 //bar.size() is 4
4.bitset::test()
返回pos位置的元素是否被设置,或者是否为1。返回值为true,或false。示例代码如下所示:
// bitset::test #include <iostream> // std::cout #include <string> // std::string #include <cstddef> // std::size_t #include <bitset> // std::bitset int main () { std::bitset<5> foo (std::string(“01011”)); std::cout << “foo contains:\n”; std::cout << std::boolalpha; for (std::size_t i=0; i<foo.size(); ++i) std::cout << foo.test(i) << ‘\n’; return 0; } //Output: //foo contains: //true //true //false //true //false
5.bitset::any()
判断是否任何一个元素被设置,或者判断是否至少有一个元素为1。示例代码如下:
// bitset::any #include <iostream> // std::cin, std::cout #include <bitset> // std::bitset int main () { std::bitset<16> foo; std::cout << "Please, enter a binary number: "; std::cin >> foo; if (foo.any()) std::cout << foo << " has “ << foo.count() << ” bits set.\n"; else std::cout << foo << " has no bits set.\n"; return 0; } //Possible output: //Please, enter a binary number: 10110 //0000000000010110 has 3 bits set.
6.bitset::none()
判断一个bitset是否没被set。如果一个bitset中有元素为1,则返回false,否则返回true。示例代码如下:
// bitset::none #include <iostream> // std::cin, std::cout #include <bitset> // std::bitset int main () { std::bitset<16> foo; std::cout << "Please, enter a binary number: "; std::cin >> foo; if (foo.none()) std::cout << foo << " has no bits set.\n"; else std::cout << foo << " has “ << foo.count() << ” bits set.\n"; return 0; } //Possible output: //Please, enter a binary number: 11010111 //0000000011010111 has 6 bits set.
7.bitset::all()
判断一个bitset是否里面所有元素都为1,如果都为1,则返回true;否则返回false;示例代码如下:
// bitset::all #include <iostream> // std::cin, std::cout, std::boolalpha #include <bitset> // std::bitset int main () { std::bitset<8> foo; std::cout << "Please, enter an 8-bit binary number: "; std::cin >> foo; std::cout << std::boolalpha; std::cout << "all: " << foo.all() << ‘\n’; std::cout << "any: " << foo.any() << ‘\n’; std::cout << "none: " << foo.none() << ‘\n’; return 0; } //Possible output: //Please, enter an 8-bit binary number: 11111111 //all: true //any: true //none: false
1.bitset::set()
设定bitset中某一个元素或者所有元素为1.示例代码如下:
// bitset::set #include <iostream> // std::cout #include <bitset> // std::bitset int main () { std::bitset<4> foo; std::cout << foo.set() << ‘\n’; // 1111 std::cout << foo.set(2,0) << ‘\n’; // 1011 std::cout << foo.set(2) << ‘\n’; // 1111 return 0; } //Output: //1111 //1011 //1111
2.bitset::reset()
将bitset中某一个元素或者所有元素重置为0,示例代码如下:
// bitset::reset #include <iostream> // std::cout #include <string> // std::string #include <bitset> // std::bitset int main () { std::bitset<4> foo (std::string(“1011”)); std::cout << foo.reset(1) << ‘\n’; // 1001 std::cout << foo.reset() << ‘\n’; // 0000 return 0; } //Output: //1001 //0000
3.bitset::flip()
反转一个bitset,即将一个bitset中所有元素0置1,1置0。示例代码如下:
// bitset::flip #include <iostream> // std::cout #include <string> // std::string #include <bitset> // std::bitset int main () { std::bitset<4> foo (std::string(“0001”)); std::cout << foo.flip(2) << ‘\n’; // 0101 std::cout << foo.flip() << ‘\n’; // 1010 return 0; } //Output: //0101 //1010
1.bitset::to_string()
将一个bitset转换为string类型,示例代码如下:
// bitset::to_string #include <iostream> // std::cout #include <string> // std::string #include <bitset> // std::bitset int main () { std::bitset<4> mybits; // mybits: 0000 mybits.set(); // mybits: 1111 std::string mystring = mybits.to_string<char,std::string::traits_type,std::string::allocator_type>(); std::cout << "mystring: " << mystring << ‘\n’; return 0; } //Output: //mystring: 1111
2.bitset::to_ulong()
将bitset转换成一个unsigned_long类型的数。示例代码如下:
// bitset::to_ulong #include <iostream> // std::cout #include <bitset> // std::bitset int main () { std::bitset<4> foo; // foo: 0000 foo.set(); // foo: 1111 std::cout << foo << " as an integer is: " << foo.to_ulong() << '\n'; return 0; } //Output: //1111 as an integer is: 15
3. bitset的运算
bitset的运算就像一个普通的整数一样,可以进行与(&)、或(|)、异或(^)、左移(<<)、右移(>>)等操作。
// bitset operators #include <iostream> // std::cout #include <string> // std::string #include <bitset> // std::bitset int main () { std::bitset<4> foo (std::string("1001")); std::bitset<4> bar (std::string("0011")); std::cout << (foo^=bar) << '\n'; // 1010 (XOR,assign) std::cout << (foo&=bar) << '\n'; // 0010 (AND,assign) std::cout << (foo|=bar) << '\n'; // 0011 (OR,assign) std::cout << (foo<<=2) << '\n'; // 1100 (SHL,assign) std::cout << (foo>>=1) << '\n'; // 0110 (SHR,assign) std::cout << (~bar) << '\n'; // 1100 (NOT) std::cout << (bar<<1) << '\n'; // 0110 (SHL) std::cout << (bar>>1) << '\n'; // 0001 (SHR) std::cout << (foo==bar) << '\n'; // false (0110==0011) std::cout << (foo!=bar) << '\n'; // true (0110!=0011) std::cout << (foo&bar) << '\n'; // 0010 std::cout << (foo|bar) << '\n'; // 0111 std::cout << (foo^bar) << '\n'; // 0101 return 0; }
有关于bitset的介绍暂时就先写这么多,这个容器出现频次没有其他几类那么高,但是还是要知道。有一些地方就可以起到出其不意的作用。
————————————————
版权声明:本文为CSDN博主「zy2317878」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zy2317878/article/details/80082863
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。