std::bitset<N>::bitset

来自cppreference.com
< cpp‎ | utility‎ | bitset
 
 
工具库
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
初等字符串转换
(C++17)
(C++17)
 
 
(1)
bitset();
(C++11 前)
constexpr bitset() noexcept;
(C++11 起)
(2)
bitset( unsigned long val );
(C++11 前)
constexpr bitset( unsigned long long val ) noexcept;
(C++11 起)
template< class CharT, class Traits, class Alloc >

explicit bitset( const std::basic_string<CharT, Traits, Alloc>& str,
                 typename std::basic_string<CharT, Traits, Alloc>::size_type
                     pos = 0,
                 typename std::basic_string<CharT, Traits, Alloc>::size_type
                     n = std::basic_string<CharT, Traits, Alloc>::npos,
                 CharT zero = CharT('0'),

                 CharT one = CharT('1') );
(3) (C++23 起 constexpr)
template< class CharT, class Traits >

constexpr explicit bitset( std::basic_string_view<CharT, Traits> str,
                           std::size_t pos = 0,
                           std::size_t n = std::size_t(-1),
                           CharT zero = CharT('0'),

                           CharT one = CharT('1') );
(4) (C++26 起)
template< class CharT >

explicit bitset( const CharT* str,
                 std::size_t n = std::size_t(-1),
                 CharT zero = CharT('0'),

                 CharT one = CharT('1') );
(5) (C++11 起)
(C++23 起 constexpr)

从数个数据源之一构造新的 bitset:

1) 默认构造函数。构造所有位都设为零的 bitset。
2) 构造 bitset,初始化首(最右、最低)M 位位置为对应 val 的位值,其中 M 是以下两者中的较小者:
  • N,及
  • unsigned long值表示中的位数。对于典型实现为 32 或 64。
(C++11 前)
  • unsigned long long值表示中的位数。对于典型实现为 64。
(C++11 起)
如果 M 小于 N,那么剩余位位置被初始化为零。
3)std::basic_string str 中的字符构造 bitset。能提供可选的起始位置 pos 和长度 n,以及指代设置(one)和不设置(zero)位的替代值的字符。用 Traits::eq() 比较字符值。
初始化字符串的有效长度是 std::min(n, str.size() - pos)
如果 pos > str.size(),那么此构造函数会抛出 std::out_of_range。如果 str 中检验到 zeroone 以外的字符,那么此构造函数会抛出 std::invalid_argument
4)(3),但用 std::basic_string_view 代替 std::basic_string
5)(3),但用 const CharT* 代替 std::basic_string。等价于
bitset(n == std::size_t(-1)
          ? basic_string<CharT>(str)
          : basic_string<CharT>(str, n), 0, n, zero, one)

此构造函数可能动态分配内存,虽然实现通常会避免动态分配。

(C++26 前)

此构造函数不会动态分配内存,如同只涉及 std::basic_string_view

(C++26 起)

参数

val - 用于初始化 bitset 的数字
str - 用于初始化 bitset 的字符串
pos - str 中的起始偏移
n - 使用来自 str 的字符数
one - 设置位于 str 中的替用字符
zero - 不设置位于 str 中的替用字符

异常

3,4)pos > str.size() 时抛出 std::out_of_range,在任何字符非一或零时抛出 std::invalid_argument
5) 在任何字符非一或零时抛出 std::invalid_argument

注解

功能特性测试 标准 注释
__cpp_lib_constexpr_bitset 202207L (C++23) (3,5) 添加 constexpr 使 std::bitset 更 constexpr
__cpp_lib_bitset 202306L (C++26) 添加重载 (4) std::bitsetstd::string_view 接口

示例

#include <bitset>
#include <string>
#include <iostream>
#include <climits>
 
int main() 
{
    // 空构造函数
    std::bitset<8> b1; // [0,0,0,0,0,0,0,0]
 
    // unsigned long long 构造函数
    std::bitset<8> b2(42);          // [0,0,1,0,1,0,1,0]
    std::bitset<70> bl(ULLONG_MAX); // [0,0,0,0,0,0,1,1,1,...,1,1,1](在 C++11 中)
    std::bitset<8> bs(0xfff0);      // [1,1,1,1,0,0,0,0]
 
    // string 构造函数
    std::string bit_string = "110010";
    std::bitset<8> b3(bit_string);       // [0,0,1,1,0,0,1,0]
    std::bitset<8> b4(bit_string, 2);    // [0,0,0,0,0,0,1,0]
    std::bitset<8> b5(bit_string, 2, 3); // [0,0,0,0,0,0,0,1]
 
    // 使用自定义零/一数字的 string 构造函数
    std::string alpha_bit_string = "aBaaBBaB";
    std::bitset<8> b6(alpha_bit_string, 0, alpha_bit_string.size(),
                      'a', 'B');         // [0,1,0,0,1,1,0,1]
 
    // 使用自定义数字的 char* 构造函数
    std::bitset<8> b7("XXXXYYYY", 8, 'X', 'Y'); // [0,0,0,0,1,1,1,1]
 
    std::cout << b1 << '\n' << b2 << '\n' << bl << '\n' << bs << '\n'
              << b3 << '\n' << b4 << '\n' << b5 << '\n' << b6 << '\n'
              << b7 << '\n';
}

可能的输出:

00000000
00101010
0000001111111111111111111111111111111111111111111111111111111111111111
11110000
00110010
00000010
00000001
01001101
00001111

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 396 C++98 重载 (3) 中使用的零字符和一字符是 01(它们并不与 '0''1' 对应) 添加参数以提供这些字符的值
LWG 457 C++98 重载 (2) 中,MN 与值 CHAR_BIT * sizeof(unsigned long)
中的较小者,但 unsigned long 不保证会使用它所有的位来表示它的值
改成考虑值表示的位数

参阅

将位置为 true 或者提供的值
(公开成员函数)
将位置为 false
(公开成员函数)