标准库模板类bitset是在<bitset>中定义的,它用于描述和处理二进制位集合。每个bitset的大小是固定的,在创建时指定:

bitset<4> flags;
bitset<128> dword_bits;
bitset<12345> lots;

  默认情况下,bitset被初始化为全0,但通常我们都会给它一个初始值,可以是一个无符号的整数或者”0“和”1“组成的字符串。例如:

bitset<4> flags=0xb;
bitset<128>dword_bits{string{"1010101010101010"}};
bitset<12345>lots;

  这两段代码中,lots被初始化为全0,dword_bits的钱112为被初始化为全0,后16位由程序显式指定。如果你给出的初始化字符串中包含0和1之外的符号,bitset会抛出一个std::invalid_argument异常:

string s;
cin>>s;
bitset<12345> my_bits(s); //可能抛出std::invalid_argument

  常用的位运算符都可用于bitset。例如,假定b1、b2和b3都是bitset:

b1=b2&b3;    //与
b1=b2|b3; //或
b1=b2^b3; //异或
b1=~b2; //补
b1=b2<<2; //左移
b1=b2>>3; //右移

  大致来说,对于位运算而言,bitset就像unsigned int 一样,只不过其大小任意,由用户指定。你能对unsigned int 做什么(除了算术运算之外),就能对bitset做什么。特别地,bitset对I/O也很有用:

cin>>b;    //从输入读取一个bitset
cout<<bitset<8>('c'); //输出字符'c'的位模式

  当读入bitset时,输入流会寻找0和1,例如,如果输入下面的内容:

10121

  输入流会读入101,21会被留下。

对于字节和字,bitset中的位是由右至左编号的(从最低有效位到最高有效位)。这样,第7位的值就是27

7: 6: 5: 4: 3: 2: 1: 0:
1 0 1 0 0 1 1 1

对于bitset而言,编号顺序不仅仅是遵循惯例的问题,还起到二进制位的索引下标的作用。例如:

#include <iostream>
#include<bitset>
using namespace std;
int main(){
int n;
const int j = n;
constexpr int max = 10;
for (bitset<max> b; cin >> b;) { cout << b << '\n';
for (int i = 0; i < max; ++i)cout << b[i];
cout << '\n';
}
}

  

c++程序设计原理与实践(进阶篇)

bitest(位集合)------c++程序设计原理与实践(进阶篇)的更多相关文章

  1. 有符号数和无符号数------c++程序设计原理与实践(进阶篇)

    有符号数与无符号数的程序设计原则: 当需要表示数值时,使用有符号数(如 int). 当需要表示位集合时,使用无符号数(如unsigned int). 有符号数和无符号数混合运算有可能会带来灾难性的后果 ...

  2. 实现求解线性方程(矩阵、高斯消去法)------c++程序设计原理与实践(进阶篇)

    步骤: 其中A是一个n*n的系数方阵 向量x和b分别是未知数和常量向量: 这个系统可能有0个.1个或者无穷多个解,这取决于系数矩阵A和向量b.求解线性系统的方法有很多,这里使用一种经典的方法——高斯消 ...

  3. 函数形参为基类数组,实参为继承类数组,下存在的问题------c++程序设计原理与实践(进阶篇)

    示例: #include<iostream> using namespace std; class A { public: int a; int b; A(int aa=1, int bb ...

  4. 函数返回值string与返回值bool区别------c++程序设计原理与实践(进阶篇)

    为什么find_from_addr()和find_subject()如此不同?比如,find_from_addr()返回bool值,而find_subject()返回string.原因在于我们想说明: ...

  5. (c++11)随机数------c++程序设计原理与实践(进阶篇)

    随机数既是一个实用工具,也是一个数学问题,它高度复杂,这与它在现实世界中的重要性是相匹配的.在此我们只讨论随机数哦最基本的内容,这些内容可用于简单的测试和仿真.在<random>中,标准库 ...

  6. 数值限制------c++程序设计原理与实践(进阶篇)

    每种c++的实现都在<limits>.<climits>.<limits.h>和<float.h>中指明了内置类型的属性,因此程序员可以利用这些属性来检 ...

  7. 编码原则实例------c++程序设计原理与实践(进阶篇)

    编码原则: 一般原则 预处理原则 命名和布局原则 类原则 函数和表达式原则 硬实时原则 关键系统原则 (硬实时原则.关键系统原则仅用于硬实时和关键系统程序设计) (严格原则都用一个大写字母R及其编号标 ...

  8. gets()scanf()有害------c++程序设计原理与实践(进阶篇)

    最简单的读取字符串的方式是使用gets(),例如: char a[12]; gets(a); 但gets()和scanf()是有害的,曾经有大约1/4的成功黑客攻击是由于gets()和它的近亲scan ...

  9. 宏(使用注意事项、主要用途)------c++程序设计原理与实践(进阶篇)

    使用宏的时候一定要小心:在c中没有真正有效的方法来避免使用宏,但宏带有严重的副作用,因为宏不遵守通常的c(或c++)作用域和类型规则——它只是一种文本替换.   宏的使用注意事项: 所以宏名全部大写. ...

随机推荐

  1. 文件操作open,r,w,a三种模式

    对文件操作的流程: 1.打开文件,得到文件句柄并赋值给一个变量: 2.通过句柄对文件进行操作 3.关闭文件 open("文件名"),默认为只读打开,如果你打开文件,不指定编码集,那 ...

  2. django-settings.py配置

    django settings 详细资料 ############ 开始项目 python3.5 pip -m install django==1.11.7 指定版本安装 pip3 install d ...

  3. Window中的内存地址(小知识)

    现在的编辑器大部分工作都是内存管理托管型,所以很少直接对Window的内存地址直接管理了. Window中的内存地址主要是以16进制数字体现的,当操作系统为32位时,那么每个内存地址为2的32次方,也 ...

  4. C语言的第二天-比较大小的小程序

    #include <stdio.h> int main() { int a,b,c,max; printf("请输入三个数:"); scanf("%d,%d, ...

  5. Money Systems 货币系统(母函数)

    Description 母牛们不但创建了他们自己的政府而且选择了建立了自己的货币系统. [In their own rebellious way],,他们对货币的数值感到好奇. 传统地,一个货币系统是 ...

  6. 04.webservice客户端调用

    不要求所有的元素都理解,真正做开发的时候,有一些必须是要用的. 以后我们做开发的时候服务访问点的集合就一个服务的访问点.服务访问点绑定了具体的一个服务类,绑定的这个东西它本身也是一个元素.往上找,四个 ...

  7. 【bzoj1056】排名系统

    1056: [HAOI2008]排名系统 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2195  Solved: 623[Submit][Statu ...

  8. C++中内存区域的划分

    栈存储区 那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区.里面的变量通常是局部变量.函数参数等. 堆存储区(自由存储区) 那些由new或者malloc分配的内存块,他们的释放编译器 ...

  9. CMake 自定义编译选项

    自定义编译选项 CMake 允许为项目增加编译选项,从而可以根据用户的环境和需求选择最合适的编译方案. 例如,可以将 MathFunctions 库设为一个可选库,如果该选项为 ON ,就使用该库定义 ...

  10. Luogu 4251 [SCOI2015]小凸玩矩阵

    BZOJ 4443 二分答案 + 二分图匹配 外层二分一个最小值,然后检验是否能选出$n - k + 1$个不小于当前二分出的$mid$的数.对于每一个$a_{i, j} \geq mid$,从$i$ ...