C++——std::Bitset

写在前面

这一篇文章系统的学习一下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

写在最后

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

猜你喜欢

转载自blog.csdn.net/zy2317878/article/details/80082863