定义于头文件 <bitset>
template< std::size_t N > |
类模板 bitset
表示一个 N
位的固定大小序列。可以用标准逻辑运算符操作位集,并将它与字符串和整数相互转换。
bitset
满足可复制构造 (CopyConstructible) 及可复制赋值 (CopyAssignable) 的要求。
模板形参
N | - | 要为 bitset 分配存储的位数 |
成员类型
reference | 表示到一个位的引用的代理类 (类) |
元素访问
访问指定的位
std::bitset<N>::operator[]
bool operator[]( std::size_t pos ) const; | (1) | (C++11 前) |
constexpr bool operator[]( std::size_t pos ) const; | (C++11 起) | |
reference operator[]( std::size_t pos ); | (2) |
访问位于位置 pos
的位。首版本返回位的值,第二版本返回允许修改位的值的 std::bitset::reference 对象。
不同于 test() ,它不抛异常:若 pos
在边界外则行为未定义。
参数
pos | - | 要返回的位的位置 |
返回值
1) 请求位的值
2) std::bitset::reference 类型对象,允许写入请求位。
异常
(无)
访问特定位
std::bitset<N>::test
bool test( size_t pos ) const; |
返回位于位置 pos
的位的值。
不同于 operator[] ,它进行边界检查,且若 pos
不对应 bitset 中的合法位置则抛出 std::out_of_range 。
参数
pos | - | 要返回的位的位置 |
返回值
若所求位被设置则为 true ,否则为 false 。
异常
若 pos
不对应 bitset 中的合法位置则抛出 std::out_of_range 。
检查是否所有、任一或无位被设为 true
std::bitset<N>::all,
std::bitset<N>::any,
std::bitset<N>::none
bool all() const noexcept; | (1) | (C++11 起) |
bool any() const; | (2) | (C++11 前) |
bool any() const noexcept; | (C++11 起) | |
bool none() const; | (3) | (C++11 前) |
bool none() const noexcept; | (C++11 起) |
检查是否全部、任一或无位被设为 true 。
1) 检查是否全部位被设为 true 。
2) 检查是否任一位被设为 true 。
3) 检查是否无位被设为 true 。
参数
(无)
返回值
1) 若全部位被设为 true 则为 true ,否则为 false
2) 若任何一位被设为 true 则为 true ,否则为 false
3) 若无位被设为 true 则为 true ,否则为 false
返回设置为true的位的数量
std::bitset<N>::count
std::size_t count() const; | (C++11 前) | |
std::size_t count() const noexcept; | (C++11 起) |
返回设为 true 的位数。
参数
(无)
返回值
设为 true 的位数。
调用示例
#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;
std::string bit_string = "110010";
std::bitset<8> bitset1(bit_string); // [0,0,1,1,0,0,1,0]
std::cout << "bitset1: " << bitset1 << std::endl;
for (size_t index = 0; index < bitset1.size(); index++)
{
//访问位于位置 pos 的位。首版本返回位的值,
//第二版本返回允许修改位的值的 std::bitset::reference 对象。
//不同于 test() ,它不抛异常:若 pos 在边界外则行为未定义。
bitset1[index] = ~bitset1[index];
}
std::cout << "bitset1: " << bitset1 << std::endl;
printBitset("bitset1", bitset1);
std::cout << std::endl;
std::bitset<8> bitset2(bit_string); // [0,0,1,1,0,0,1,0]
std::cout << "bitset2: " << bitset2 << std::endl;
std::cout << "bitset2: " ;
for (size_t index = 0; index < bitset1.size(); index++)
{
//返回位于位置 pos 的位的值。
//不同于 operator[] ,它进行边界检查,
//且若 pos 不对应 bitset 中的合法位置则抛出 std::out_of_range 。
std::cout << bitset2.test(index) << " ";
}
std::cout << std::endl;
std::cout << std::endl;
std::bitset<6> bitset3("111111");
std::bitset<6> bitset4("010101");
std::bitset<6> bitset5("000000");
//1) 检查是否全部位被设为 true 。
std::cout << bitset3 << " --- " << "bool all() const noexcept: "
<< bitset3.all() << std::endl;
std::cout << bitset4 << " --- " << "bool all() const noexcept: "
<< bitset4.all() << std::endl;
std::cout << bitset5 << " --- " << "bool all() const noexcept: "
<< bitset5.all() << std::endl;
//2) 检查是否任一位被设为 true 。
std::cout << bitset3 << " --- " << "bool any() const noexcept: "
<< bitset3.any() << std::endl;
std::cout << bitset4 << " --- " << "bool any() const noexcept: "
<< bitset4.any() << std::endl;
std::cout << bitset5 << " --- " << "bool any() const noexcept: "
<< bitset5.any() << std::endl;
//3) 检查是否无位被设为 true 。
std::cout << bitset3 << " --- " << "bool none() const noexcept: "
<< bitset3.none() << std::endl;
std::cout << bitset4 << " --- " << "bool none() const noexcept: "
<< bitset4.none() << std::endl;
std::cout << bitset5 << " --- " << "bool none() const noexcept: "
<< bitset5.none() << std::endl;
std::cout << std::endl;
//返回设为 true 的位数。
std::cout << bitset3 << " --- " << "bool count() const noexcept: "
<< bitset3.count() << std::endl;
std::cout << bitset4 << " --- " << "bool count() const noexcept: "
<< bitset4.count() << std::endl;
std::cout << bitset5 << " --- " << "bool count() const noexcept: "
<< bitset5.count() << std::endl;
return 0;
}
输出