当前位置:   article > 正文

C++——std::Bitset(转载)

std::bitset

写在前面

这一篇文章系统的学习一下std标准库中的容器bitset,一个bitset是用来储存诸多bit,这些元素可以用来表示两种状态:0或1,true或false…。所以有一些时候可以很方便的用该容器快速实现状态储存。

该容器通过对空间的特殊优化,使得该容器对状态的储存空间非常小,相当于将若干状态储存在一个个bit上。该容器的元素访问也可以通过[n]访问容器中第n个元素,但是由于一般语言没有一个bit大小的数据类型,所以这里使用了一种特殊的引用类型访问,如:bitset::reference。

bitset类与头文件包含

bitset头文件引用如下:
#include <bitset>  
bitset::bitset
  • 1
  • 2

构造一个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
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

总的来说,有四种方法构造一个bitset,可参考:bitset基础用法+心得

TablesAre
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

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.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

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.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

写在最后

有关于bitset的介绍暂时就先写这么多,这个容器出现频次没有其他几类那么高,但是还是要知道。有一些地方就可以起到出其不意的作用。

————————————————
版权声明:本文为CSDN博主「zy2317878」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zy2317878/article/details/80082863

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/329732
推荐阅读
相关标签
  

闽ICP备14008679号