写在前面
这一篇文章系统的学习一下std标准库中的容器bitset,一个bitset是用来储存诸多bit,这些元素可以用来表示两种状态:0或1,true或false…。所以有一些时候可以很方便的用该容器快速实现状态储存。
该容器通过对空间的特殊优化,使得该容器对状态的储存空间非常小,相当于将若干状态储存在一个个bit上。该容器的元素访问也可以通过[n]访问容器中第n个元素,但是由于一般语言没有一个bit大小的数据类型,所以这里使用了一种特殊的引用类型访问,如:bitset::reference。
bitset类与头文件包含
bitset头文件引用如下:#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 |
Bit access
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
Bit operations
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
Bitset operations
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