C++基础之bitset

类模板std::bitset

template <size_t N> class bitset;

头文件

#include <bitset>

说明

一个bitset中保存了一些bit(字节, 只能取两个值的元素:0或1,真或假 …)
bitset模拟了一个bool类型的数组,但是优化了内存空间:总的来说,每个元素值占用一个bit(比大多数系统中最小的元素char小了8倍)
每个位置的都可以独立的访问:例如,给定一个bitset命名为foo,foo[3]访问的就是第四个元素,就像通常数组访问他的元素一样。
但是因为在C++中没有只占用一个字节的类型,bitset是通过专门的引用类型来实现每个元素单独访问的(可以查看bitset::reference)。
bitset可以通过integer值和二元内容的字符串来创建,也可以转换为interger值和字符串(查看bitset的构造函数和to_ulong、to_sting方法)。可以插入到内容为二元类型的流中,也可以从二元类型的流中提取(查看bitset适用的操作符)。
bitset的大小在编译阶段就已经确定(由模板的参数决定)。对于同样对空间进行优化并且可以动态改变大小的类,可以使用一个专门为bool类型创建的vector 类(vector)。

模板类的参数

N:指定bitset的大小,根据所占bit的数量。可以通过bitset的成员函数bitset::size来获取。size_t是一个无符号整型。

成员类型

reference

像一个类型来引用。
这是一个嵌入式类,当在一个非const的bitset对象上使用下标操作符bitset::operator[]来访问元素的时候会返回该类型。通过一个模拟指向bool类型引用的接口来访问每个元素。
原型定义:

C++11:
class bitset::reference {
  friend class bitset;
  reference() noexcept;                               // no public constructor
public:
  ~reference();
  operator bool() const noexcept;                     // convert to bool
  reference& operator= (bool x) noexcept;             // assign bool
  reference& operator= (const reference& x) noexcept; // assign bit
  reference& flip() noexcept;                         // flip bit value
  bool operator~() const noexcept;                    // return inverse value
}

成员函数

构造函数(c++11)

函数原型
在这里插入图片描述构造一个bitset容器对象:
1.默认构造函数: 对象中的值都设置为0
2.由integer值初始化bitset对象: 使用val对应的bit值来初始化bitset对象,参考例子
3.使用string或着(4)中的C-string来初始化对象: 使用str中的0和(或)1的序列来初始化bitset对象的前n个值。
注意: 不管用哪个构造函数构造出来的bitset对象的大小是不可变的(大小由类模板的参数决定)。没有被构造函数赋值的位会被初始化为0。
参数
val: 将integer类型值对应的bits位的值拷贝到bitset对象的对应位置。
1.如果val的位数大于bitset的size大小,只将val的低位的size个bit赋值给bitset
2.如果val的位数小于bitset的size大小,不足的部分补零。
str: 用来初始化bitset对象的string或这C-string。构造函数最多解析字符串的n个字符(第三个构造函数是从pos的位置开始读取),然后依次将每个字符的值解析为0和1。【注意】最后读取的字符赋值给最低有效位,字符串下标0在高有效位(参考例子)。因此bitset的第一位的值是string的最右边的值,然后从右到左一次读取。如果string序列比bitset的size小,剩余的补零。
pos: 从string读取的起始位置,如果超过了str的长度会抛出out_of_range的异常。
zero,one: 来表示0和1的字符。
Example:

// constructing bitsets
#include <iostream>       // std::cout
#include <string>         // std::string
#include <bitset>         // std::bitset
int main () {
  std::bitset<16> foo;
  std::bitset<16> bar (0xfa2);
  std::bitset<16> baz (std::string("0101111001"));

  std::cout << "foo: " << foo << '\n';
  std::cout << "bar: " << bar << '\n';
  std::cout << "baz: " << baz << '\n';

  return 0;
}

Output:

foo: 0000000000000000
bar: 0000111110100010
baz: 0000000101111001

数据竞争
构造函数3和4中会访问str中的字符。
异常和安全
1和2构造函数不会抛出异常。3和4在pos大于length的时候会抛出out_of_length的异常。

适用的操作符(C++11)

在这里插入图片描述对bitset中的内容执行逐位的操作。
参数
lhs: 操作符左侧的bitset对象(操作符不会修改该值)
rhs: 操作符右边的bitset对象,操作符左侧和右侧的bitset对象的size必须相同(类模板的N相等)。
pos: 要移动的位数
is,os࿱

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值