C++ STL bitset 容器如何实现高效位操作与复杂逻辑处理?

2026-04-17 00:241阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1156个文字,预计阅读时间需要5分钟。

C++ STL bitset 容器如何实现高效位操作与复杂逻辑处理?

C++ STL bitset 容器详解:本篇随笔讲解 (C++STL) 中 (bitset) 容器的用法及常见使用技巧。bitset 容器实际上是一个 (01) 串。它可以被视为一个 (bool) 数组。与 (bool) 数组相比,bitset 容器更高效。

C++ STL bitset 容器详解

本篇随笔讲解\(C++STL\)中\(bitset\)容器的用法及常见使用技巧。

\(bitset\)容器概论

\(bitset\)容器其实就是个\(01\)串。可以被看作是一个\(bool\)数组。它比\(bool\)数组更优秀的优点是:节约空间,节约时间,支持基本的位运算。在\(bitset\)容器中,\(8\)位占一个字节,相比于\(bool\)数组\(4\)位一个字节的空间利用率要高很多。同时,\(n\)位的\(bitset\)在执行一次位运算的复杂度可以被看作是\(n/32\),这都是\(bool\)数组所没有的优秀性质。

\(bitset\)容器包含在\(C++\)自带的\(bitset\)库中。

#include<bitset>

\(bitset\)容器的声明

因为\(bitset\)容器就是装\(01\)串的,所以不用在< >中装数据类型,这和一般的\(STL\)容器不太一样。< >中装\(01\)串的位数

如:(声明一个\(10^5\)位的\(bitset\))

bitset<100000> s;

对\(bitset\)容器的一些操作

1、常用的操作函数

和其他的\(STL\)容器一样,对\(bitset\)的很多操作也是由自带函数来实现的。下面,我们来介绍一下\(bitset\)的一些常用函数及其使用方法。

  • \(count()\)函数

\(count\),数数的意思。它的作用是数出\(1\)的个数。即\(s.count()\)返回\(s\)中有多少个\(1\).

s.count();

  • \(any()/none()\)函数

\(any\),任何的意思。\(none\),啥也没有的意思。这两个函数是在检查\(bitset\)容器中全\(0\)的情况。

如果,\(bitset\)中全都为\(0\),那么\(s.any()\)返回\(false\),\(s.none()\)返回\(true\)。

C++ STL bitset 容器如何实现高效位操作与复杂逻辑处理?

反之,假如\(bitset\)中至少有一个\(1\),即哪怕有一个\(1\),那么\(s.any()\)返回\(true\),\(s.none()\)返回\(false\).

s.any(); s.none();

  • \(set()\)函数

\(set()\)函数的作用是把\(bitset\)全部置为\(1\).

特别地,\(set()\)函数里面可以传参数。\(set(u,v)\)的意思是把\(bitset\)中的第\(u\)位变成\(v,v\in 0/1\)。

s.set(); s.set(u,v);

  • \(reset()\)函数

与\(set()\)函数相对地,\(reset()\)函数将\(bitset\)的所有位置为\(0\)。而\(reset()\)函数只传一个参数,表示把这一位改成\(0\)。

s.reset(); s.reset(k);

  • \(flip()\)函数

\(flip()\)函数与前两个函数不同,它的作用是将整个\(bitset\)容器按位取反。同上,其传进的参数表示把其中一位取反。

s.flip(); s.flip(k);

2、位运算操作在\(bitset\)中的实现

\(bitset\)的作用就是帮助我们方便地实现位运算的相关操作。它当然支持位运算的一些操作内容。我们在编写程序的时候对数进行的二进制运算均可以用在\(bitset\)函数上。

比如:

~:按位取反

&:按位与

|:按位或

^:按位异或

<< >>:左/右移

==/!=:比较两个\(bitset\)是否相等。

关于位运算的相关知识,不懂的小伙伴请戳这里:

常用的位运算技巧

另外,\(bitset\)容器还支持直接取值和直接赋值的操作:具体操作方式如下:

s[3]=1; s[5]=0;

这里要注意:在\(bitset\)容器中,最低位为\(0\)。这与我们的数组实现仍然有区别。

\(bitset\)容器的实际应用

\(bitset\)可以高效率地对\(01\)串,\(01\)矩阵等等只含\(0/1\)的题目进行处理。其中支持的许多操作对我们处理数据非常有帮助。如果碰到一道\(0/1\)题,使用\(bitset\)或许是不错的选择。

本文共计1156个文字,预计阅读时间需要5分钟。

C++ STL bitset 容器如何实现高效位操作与复杂逻辑处理?

C++ STL bitset 容器详解:本篇随笔讲解 (C++STL) 中 (bitset) 容器的用法及常见使用技巧。bitset 容器实际上是一个 (01) 串。它可以被视为一个 (bool) 数组。与 (bool) 数组相比,bitset 容器更高效。

C++ STL bitset 容器详解

本篇随笔讲解\(C++STL\)中\(bitset\)容器的用法及常见使用技巧。

\(bitset\)容器概论

\(bitset\)容器其实就是个\(01\)串。可以被看作是一个\(bool\)数组。它比\(bool\)数组更优秀的优点是:节约空间,节约时间,支持基本的位运算。在\(bitset\)容器中,\(8\)位占一个字节,相比于\(bool\)数组\(4\)位一个字节的空间利用率要高很多。同时,\(n\)位的\(bitset\)在执行一次位运算的复杂度可以被看作是\(n/32\),这都是\(bool\)数组所没有的优秀性质。

\(bitset\)容器包含在\(C++\)自带的\(bitset\)库中。

#include<bitset>

\(bitset\)容器的声明

因为\(bitset\)容器就是装\(01\)串的,所以不用在< >中装数据类型,这和一般的\(STL\)容器不太一样。< >中装\(01\)串的位数

如:(声明一个\(10^5\)位的\(bitset\))

bitset<100000> s;

对\(bitset\)容器的一些操作

1、常用的操作函数

和其他的\(STL\)容器一样,对\(bitset\)的很多操作也是由自带函数来实现的。下面,我们来介绍一下\(bitset\)的一些常用函数及其使用方法。

  • \(count()\)函数

\(count\),数数的意思。它的作用是数出\(1\)的个数。即\(s.count()\)返回\(s\)中有多少个\(1\).

s.count();

  • \(any()/none()\)函数

\(any\),任何的意思。\(none\),啥也没有的意思。这两个函数是在检查\(bitset\)容器中全\(0\)的情况。

如果,\(bitset\)中全都为\(0\),那么\(s.any()\)返回\(false\),\(s.none()\)返回\(true\)。

C++ STL bitset 容器如何实现高效位操作与复杂逻辑处理?

反之,假如\(bitset\)中至少有一个\(1\),即哪怕有一个\(1\),那么\(s.any()\)返回\(true\),\(s.none()\)返回\(false\).

s.any(); s.none();

  • \(set()\)函数

\(set()\)函数的作用是把\(bitset\)全部置为\(1\).

特别地,\(set()\)函数里面可以传参数。\(set(u,v)\)的意思是把\(bitset\)中的第\(u\)位变成\(v,v\in 0/1\)。

s.set(); s.set(u,v);

  • \(reset()\)函数

与\(set()\)函数相对地,\(reset()\)函数将\(bitset\)的所有位置为\(0\)。而\(reset()\)函数只传一个参数,表示把这一位改成\(0\)。

s.reset(); s.reset(k);

  • \(flip()\)函数

\(flip()\)函数与前两个函数不同,它的作用是将整个\(bitset\)容器按位取反。同上,其传进的参数表示把其中一位取反。

s.flip(); s.flip(k);

2、位运算操作在\(bitset\)中的实现

\(bitset\)的作用就是帮助我们方便地实现位运算的相关操作。它当然支持位运算的一些操作内容。我们在编写程序的时候对数进行的二进制运算均可以用在\(bitset\)函数上。

比如:

~:按位取反

&:按位与

|:按位或

^:按位异或

<< >>:左/右移

==/!=:比较两个\(bitset\)是否相等。

关于位运算的相关知识,不懂的小伙伴请戳这里:

常用的位运算技巧

另外,\(bitset\)容器还支持直接取值和直接赋值的操作:具体操作方式如下:

s[3]=1; s[5]=0;

这里要注意:在\(bitset\)容器中,最低位为\(0\)。这与我们的数组实现仍然有区别。

\(bitset\)容器的实际应用

\(bitset\)可以高效率地对\(01\)串,\(01\)矩阵等等只含\(0/1\)的题目进行处理。其中支持的许多操作对我们处理数据非常有帮助。如果碰到一道\(0/1\)题,使用\(bitset\)或许是不错的选择。