C++ Bitset

2025 年 8 月 29 日 | 阅读 10 分钟

在 C++ 中,bitset 是一个容器,它包含一个固定大小的位(0 和 1)序列。它使我们能够高效地管理和操作固定大小的位序列。它在低级操作、内存高效存储和位逻辑操作方面很有用。它被实现为一个类模板,并定义在 std 命名空间中的 <bitset> 头文件中。

语法

它具有以下语法:

在此语法中,N 是我们想要存储的位数,b 是分配的名称。

Bitset 的初始化

C++ 中,我们可以根据其用例以几种方式初始化 bitset 函数。Bitset 是一个固定大小的 N 位序列(例如 0 和 1),我们可以单独操作每一位。当我们创建 bitset 时,所有位默认都是未设置(0)。但是,我们可以在声明期间用确定的值对其进行初始化。C++ 中 bitset 的几种初始化方式如下:

1) 默认初始化(所有位 = 0)

在这里,bitset 的大小是 7 位,

2) 使用无符号长整型初始化

我们也可以使用无符号长整型值来初始化 bitset。在无符号长整型中,数字的二进制表示从右到左存储。

3) 使用二进制字符串初始化

字符串必须具有与 bitset 大小相同或更少的字符。多余的位会从左侧截断。

C++ Bitset 示例

让我们举一个例子来说明如何在 C++ 中初始化 bitset。

示例

编译并运行

输出

b1: 00000000
b2: 00001111
b3: 00001111
b4: 10101010

说明

在此示例中,我们演示了如何以不同方式初始化 std::bitset<8>。首先,b1 是默认初始化的(所有位都为 0)。b2 使用整数 15,其二进制表示为 00001111。b3 使用二进制字符串 "00001111"。b4 使用 std::string 和位 "10101010"。

访问位

在 C++ 中,std::bitset 容器允许高效地访问和操作任何位置的单个位。有两种主要方法可以访问位。

  • test (pos): 如果该位置的位是 1,则返回 true (1);如果该位置的位是 0,则返回 false (0)。
  • operator[pos]: 它提供对特定位置的位的直接访问。

pos 表示位从 0 开始的索引或位置。它应该在范围 (0 ≤ pos ≤ size - 1) 内;否则,将引发边界异常。

C++ 访问位示例

让我们举一个例子来说明如何在 C++ 中访问位。

示例

编译并运行

输出

Bitset: 11001001
Bit at position 0: 1
Bit at position 5: 0
Bit at position 4 is not set (0).
Modified Bitset: 11000001

说明

在此示例中,我们采用了一个 8 位 bitset,并使用二进制值 "11001001" 进行初始化。之后,我们使用 [] 运算符和 test() 函数。这些函数检查特定的位位置并打印它们的值,而 test() 函数用于检查位是否已设置。

设置、重置和翻转位

在 C++ 中,std::bitset 提供了许多有用的函数来处理单个位或所有位。我们可以使用 set() 函数将位设置为 1,使用 reset() 函数通过将位设置为 0 来清除位。之后,还可以使用 flip() 函数来切换位的状态。如果位是 1,它会变成 0;如果它是 0,它会变成 1。

C++ 设置、重置和翻转位的示例

让我们举一个例子来说明如何在 C++ 中设置、重置和翻转位。

示例

编译并运行

输出

Original:      00001100
After set(0):  00001101
After set():   11111111
After reset(3):11110111
After reset(): 00000000
After flip(1): 00000010
After flip():  11111101

说明

在此示例中,我们采用了 set()、reset() 和 flip() 函数,它们可以处理单个位和整个 bitset。这些操作使我们能够有效地在固定大小的二进制序列中打开、关闭或切换位。

C++ Bitset 中的函数

Bitset 在 C++ 中有几个函数。其中一些如下:

函数描述
all()用于测试和检查所有位是否都已正确设置。
any()用于检查是否有任何位被设置。
count()用于计算设置位的数量。
flip()用于翻转所提供索引处的位值。
none()用于检查所有位是否都未设置。
operator[]用于通过索引访问单个位。
reset()用于将给定索引处的位值设置为 0。
set()用于将给定索引处的位值设置为 1。
size()用于返回 bitset 的大小。
test()用于返回给定索引处的布尔值。
to_string()用于将 bitset 转换为字符串。
to_ullong()用于将 bitset 转换为无符号长长整型。
to_ulong()()用于将 bitset 转换为无符号长整型。

现在,我们将逐一讨论这些函数。

bitset::all()

在 C++ bitsets 中,此操作用于测试和检查所有位是否都已正确设置。

语法

它具有以下语法:

如果 bitset 中的每个位都是 1,则返回 true;否则返回 false。

C++ bitset::all() 示例

让我们举一个例子来说明 C++ 中的 bitset::all() 函数。

示例

编译并运行

输出

b1.all(): 1
b2.all(): 0

说明

在此示例中,我们演示了 std::bitset 的 .all() 成员函数。它包含适当的头文件并声明了两个 8 位 bitset。初始 bitset b1 的所有位都设置为 1(11111111)。第二个 bitset b2 只有前四位被设置(11110000)。b1.all() 函数返回 true,因为所有位都已设置,但 b2.all() 返回 false,因为并非所有位都已设置。

bitset::any()

在 C++ 中,std::bitset 的 .any() 方法返回是否有至少一个位等于 1。

  • 如果 bitset 中有任何一个位是 1,则返回 true。
  • 如果所有位都是 0,则返回 false。

C++ bitset::any() 示例

让我们举一个例子来说明 C++ 中的 bitset::any() 函数。

示例

编译并运行

输出

b1.any(): 0
b2.any(): 1

说明

在此示例中,我们采用了两个 8 位 bitset,b1 的所有位都为 0,b2 的一个位在从右侧开始的第 4 位被设置为 1。之后,在两个 bitset 上调用 any() 方法。对于 b1,any() 函数返回 false (0),因为所有位都为 0。对于 b2,any() 返回 true (1),因为它至少有一个位是 1。

bitset::count() 和 bitset::none()

  • 在 C++ 中,count() 方法返回 bitset 中设置为 1 的位的数量。
  • 只要所有位都是 0,none() 就为 true;否则为 false。

C++ bitset::count() 和 none() 示例

让我们举一个例子来说明 C++ 中的 count() 和 none() 函数。

示例

编译并运行

输出

b1:       00000000
b1.count(): 0
b1.none():  1
b2:       10101010
b2.count(): 4
b2.none():  0

说明

在此示例中,表达式 b1.count() 返回 b1 中设置的 1 的数量,即 0。b1.none() 返回 true,因为 b1 中没有设置为 1 的位。对于 b2,count() 返回 4,因为 bitset 中有四个 1。之后,b2.none() 返回 false,因为并非所有位都设置为 0。每个结果都会显示到两个 bitset 的控制台上。程序通过返回 0 终止。

bitset::operator[], bitset::size() 和 bitset::test()

  • 在 C++ bitset 中,operator[] 函数用于引用特定位。
  • size() 函数用于返回位的数量。
  • test() 函数用于访问给定位置的位的值。

C++ bitset::operator[], size(), 和 test() 示例

让我们举一个例子来说明 C++ 中的 operator[], size(), 和 test() 函数。

示例

编译并运行

输出

Bitset:     10110010
Size:       8
b[2]:       0
b.test(2):  0

说明

在此示例中,我们首先用二进制值 "10110010" 初始化一个 8 位 bitset b。之后,显示 bitset 以揭示其内容。调用 size() 成员函数以获取 bitset 中的位数,即 8。随后,使用 b[2] 来引用位置 2(从右侧开始)的位,它返回 0。之后,使用 b.test(2) 安全地检查同一位的值,它返回 0。

bitset::to_string(), bitset::to_ullong(), 和 bitset::to_ulong()

  • 在 C++ bitset 中,to_string() 函数返回 bitset 的字符串表示形式,包含 '0' 和 '1' 字符。
  • to_ullong() 函数返回一个表示 bitset 的无符号长长整型。
  • to_ulong() 函数返回一个表示 bitset 的无符号长整型。

C++ to_string(), to_ullong, 和 to_ulong 示例

让我们举一个例子来说明 C++ 中的 to_string、to_ullong 和 to_ulong 函数。

示例

编译并运行

输出

Bitset:       10101010
to_string():  10101010
to_ulong():   170
to_ullong():  170

说明

在此示例中,创建了一个 8 位 bitset b,其二进制值为 10101010。to_string() 函数用于将 bitset 转换为由字符 '1' 和 '0' 组成的字符串,并将其存储在变量 s 中。之后,to_ulong() 操作将 bitset 转换为无符号长整型,to_ullong() 将其转换为无符号长长整型。由于二进制中的 10101010 等于十进制的 170,因此两种数值转换都产生值 170。

为什么 Bitset 是更好的选择

在 C++ 中,bitset 是执行按位操作和处理二进制数据的首选类,原因如下:

  1. Bitsets 在内存方面经济高效,因为每个位只需要一位,因此它们适用于大型二进制数据集。
  2. Bitsets 提供了比使用整数或布尔数组来处理大型位数组更好的替代方案,可以实现低成本的位操作。
  3. Bitset 提供了一种方便的方式来处理位,而无需编写复杂的自定义函数。
  4. 由于 bitset 的大小在编译时可知,因此它能够实现统一的内存使用和性能,特别适用于效率至关重要的应用程序。
  5. 使用 bitsets 可以明确地指示位级操作,从而提高代码的可读性并减少错误。

结论

在 C++ 中,bitset 被用作一种优化技术。它使用整个数组或基于向量的 bitset 的固定表示集,以 true 或 false 和 0 和 1 的形式表示,这标志着 bitset 表示在流中的未设置和已设置状态。因此,可以说 bitset C++ 标准库改进并简化了这些过程。

C++ Bitset MCQs

1) C++ 中的 std::bitset<8> b1; 语句执行什么操作?

  1. 将所有位初始化为 1
  2. 将所有位初始化为 0
  3. 使位未初始化
  4. 从默认二进制字符串初始化
 

答案: b) 将所有位初始化为 0


2) 在 C++ 中,以下哪个 bitset 函数在至少有一个位被设置时返回 true?

  1. all()
  2. none()
  3. any()
  4. test()
 

答案: c) any()


3) 如果 b1 = std::bitset<8>("10101010"),则 C++ 中 b1.count() 的输出将是什么?

  1. 2
  2. 4
  3. 6
  4. 8
 

答案: b) 4


4) 哪个函数在 C++ 中翻转 bitset 中的所有位?

  1. flip(pos)
  2. flip()
  3. reset()
  4. set()
 

答案: b) flip()


5) 在 C++ 中,以下哪个方法在索引超出范围时会引发异常?

  1. operator[]
  2. test()
  3. count()
  4. size()
 

答案: b) test()


下一主题C++ Map