定义于头文件 <bitset>
template< std::size_t N > |
类模板 bitset
表示一个 N
位的固定大小序列。可以用标准逻辑运算符操作位集,并将它与字符串和整数相互转换。
bitset
满足可复制构造 (CopyConstructible) 及可复制赋值 (CopyAssignable) 的要求。
模板形参
N | - | 要为 bitset 分配存储的位数 |
成员函数
构造 bitset
std::bitset<N>::bitset
bitset(); | (1) | (C++11 前) |
constexpr bitset() noexcept; | (C++11 起) | |
bitset( unsigned long val ); | (2) | (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, | (3) | (C++11 前) |
template< class CharT, class Traits, class Alloc > explicit bitset( const std::basic_string<CharT,Traits,Alloc>& str, | (C++11 起) | |
template< class CharT > explicit bitset( const CharT* str, | (4) | (C++11 起) |
从数个数据源之一构造新的 bitset :
1) 默认构造函数。构造所有位设为零的 bitset 。
2) 构造 bitset ,初始化其首(最右、最低) M
位位置为对应 val
的位值,其中 M
是 unsigned long long
的位数和正在构造的 bitset 中的位数 N
的较小者。若 M 小于 N ( bitset 长于 32 (C++11 前)64 (C++11 起) 位,对于典型的 unsigned long (C++11 起)long 实现),则剩余位位置被初始化为零。
3) 用 std::basic_string str
中的字符构造 bitset 。能提供可选的起始位置 pos
和长度 n
,以及指代设置( one
)和不设置( zero
)位的替代值的字符。用 Traits::eq()
比较字符值。
初始化字符串的有效长度是 min(n
, str.size() - pos
) 。
若 pos > str.size()
,则构造函数抛出 std::out_of_range 。若 str
中检验到的任何字符非 zero
或 one
,则抛出 std::invalid_argument 。
4) 同 (3) ,但用 CharT*
代替 std::basic_string 。等价于 bitset(n == basic_string<CharT>::npos ? basic_string<CharT>(str) : basic_string<CharT>(str, n), 0, n, zero, one) 。
参数
val | - | 用于初始化 bitset 的数字 |
str | - | 用于初始化 bitset 的字符串 |
pos | - | str 中的起始偏移 |
n | - | 使用来自 str 的字符数 |
one | - | 设置位于 str 中的替用字符 |
zero | - | 不设置位于 str 中的替用字符 |
异常
3) 若 pos > str.size() 则为 std::out_of_range ,若任何字符非一或零则为 std::invalid_argument
4) std::invalid_argument ,若任何字符非一或零
调用示例
#include <iostream>
#include <bitset>
#include <string>
template<size_t _Nb>
void printBitset(const std::string &name, const std::bitset<_Nb> &bitset)
{
std::cout << name << ": ";
for (size_t index = 0; index < bitset.size(); index++)
{
std::cout << bitset[index] << " ";
}
std::cout << std::endl;
}
int main()
{
std::cout << std::boolalpha;
//从数个数据源之一构造新的 bitset : 1) 默认构造函数。构造所有位设为零的 bitset 。
std::bitset<6> bitset1;
std::cout << "bitset1: " << bitset1 << std::endl;
printBitset("bitset1", bitset1);
std::cout << std::endl;
// 2) 构造 bitset ,初始化其首(最右、最低) M 位位置为对应 val 的位值,
//其中 M 是 unsigned long long 的位数和正在构造的 bitset 中的位数 N 的较小者。
//若 M 小于 N ( bitset 长于 32 (C++11 前)64 (C++11 起) 位,
//对于典型的 unsigned long (C++11 起)long 实现),则剩余位位置被初始化为零。
std::bitset<6> bitset2(100);
std::cout << "bitset2: " << bitset2 << std::endl;
printBitset("bitset2", bitset2);
std::cout << std::endl;
//3) 用 std::basic_string str 中的字符构造 bitset 。
//能提供可选的起始位置 pos 和长度 n ,以及指代设置( one )和不设置( zero )位的替代值的字符。
//用 Traits::eq() 比较字符值。
//初始化字符串的有效长度是 min(n, str.size() - pos) 。
//若 pos > str.size() ,则构造函数抛出 std::out_of_range 。
//若 str 中检验到的任何字符非 zero 或 one ,则抛出 std::invalid_argument 。
std::string bit_string = "110010";
std::bitset<8> bitset3(bit_string); // [0,0,1,1,0,0,1,0]
std::cout << "bitset3: " << bitset3 << std::endl;
printBitset("bitset3", bitset3);
std::bitset<8> bitset4(bit_string, 2);
std::cout << "bitset4: " << bitset4 << std::endl;
printBitset("bitset4", bitset4);
std::bitset<8> bitset5(bit_string, 1, 5);
std::cout << "bitset5: " << bitset5 << std::endl;
printBitset("bitset5", bitset5);
std::cout << std::endl;
//4) 同 (3) ,但用 CharT* 代替 std::basic_string 。
//等价于 bitset(n == basic_string<CharT>::npos ?
//basic_string<CharT>(str) : basic_string<CharT>(str, n), 0, n, zero, one) 。
std::string alpha_bit_string = "aBaaBBaB";// [0,1,0,0,1,1,0,1]
std::bitset<8> bitset6(alpha_bit_string, 0, alpha_bit_string.size(), 'a', 'B');
std::cout << "bitset6: " << bitset6 << std::endl;
printBitset("bitset6", bitset6);
std::cout << std::endl;
std::bitset<8> bitset7("XXXXYYYY", 8, 'X', 'Y'); // [0,0,0,0,1,1,1,1]
std::cout << "bitset7: " << bitset7 << std::endl;
printBitset("bitset7", bitset7);
std::cout << std::endl;
return 0;
}
输出