bitest(位集合)------c++程序设计原理与实践(进阶篇)

标准库模板类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++程序设计原理与实践(进阶篇)

时间: 2024-10-03 14:02:32

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

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

有符号数与无符号数的程序设计原则: 当需要表示数值时,使用有符号数(如 int). 当需要表示位集合时,使用无符号数(如unsigned int). 有符号数和无符号数混合运算有可能会带来灾难性的后果.例如: vector<int> v; for(int i=0;i<v.size();++i)cout<<v[i]<<'\n'; 易实现版本: unsigned char max=160; //非常大 for(signed char i=0;i<max;i++)

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

步骤: 其中A是一个n*n的系数方阵 向量x和b分别是未知数和常量向量: 这个系统可能有0个.1个或者无穷多个解,这取决于系数矩阵A和向量b.求解线性系统的方法有很多,这里使用一种经典的方法--高斯消去法(https://zh.wikipedia.org/wiki/高斯消去法).首先,我们对A和b进行交换,使得A变为一个上三角矩阵.上三角矩阵就是对角线之下的所有元素均为0.即如下形式: 实现这个目标是很容易的.为了使a(i,j)变为0,我们先将它乘以一个常量,使它等于第j列上的另一个元素,比如说

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

编码原则: 一般原则 预处理原则 命名和布局原则 类原则 函数和表达式原则 硬实时原则 关键系统原则 (硬实时原则.关键系统原则仅用于硬实时和关键系统程序设计) (严格原则都用一个大写字母R及其编号标识,而推荐原则都用小写字母r及其编号标识,对于前者程序员必须严格遵守,而后者则偶尔可以不遵守) 1.一般原则 R100:任何函数和类的代码规模都不应超过200行(不包括注释). 原因:长的函数和类会更复杂,因而难以理解和测试. r101:任何函数和类都应该能完全显示在一屏上,并完成单一的逻辑功能.

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

每种c++的实现都在<limits>.<climits>.<limits.h>和<float.h>中指明了内置类型的属性,因此程序员可以利用这些属性来检查数值限制.设置哨兵机制等等.它们对于开发底层程序是非常重要的.如果你觉得需要这些属性值,表明你的工作很可能比较靠近硬件.但这些属性还有其他用途,例如,对语言实现细节感到好奇是很正常的:"一个int有多大?","char是有符号的吗?"等等.希望从系统文档中找到这些问题

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

随机数既是一个实用工具,也是一个数学问题,它高度复杂,这与它在现实世界中的重要性是相匹配的.在此我们只讨论随机数哦最基本的内容,这些内容可用于简单的测试和仿真.在<random>中,标准库提供了复杂的方法来产生适应不同数学分布的随机数.这一随机数标准库基于下面两个基础概念: 发生器(engine,随机数发生器):发生器是一个可以产生均匀分布整形值序列的函数对象. 分布(distribution):分布是一个函数对象,给定一个发生器产生的序列作为输入,分布可以按照相应数学公式产生一个值的序列.

《C++程序设计原理与实践》读书笔记(三)

一个显示模型 一种图形及图形用户界面直接对应屏幕显示的思想.其基本概念先天就是图形化的(而且都是二维的,适应计算机屏幕的矩形区域),这些基本概念包括坐标.线.矩形和圆等.从编程的角度看,其目的是建立内存中的对象和屏幕图像的直接对应关系. 其基本模型如下:我们利用图形系统提供的基本对象(如线)组合出更复杂的对象:然后将这些对象添加到一个表示物理屏幕的窗口对象中:最后,用一个程序将我们添加到窗口上的对象显示在屏幕上,我们可以将这个程序看做屏幕显示本身,或者是一个"显示引擎",或者是&quo

《C++程序设计原理与实践》读书笔记(一)

程序设计是这样一门艺术,它将问题求解方案描述成计算机可以执行的形式.程序设计中很多工作都花费在求解方案以及对其求精上.通常,只须在真正编写程序求解一个问题的过程中才会对问题本身理解透彻.   为什么学习C++这门程序设计语言呢?学习程序设计不可能不借助一门程序设计语言,而C++直接支持现实世界中的软件所使用的那些关键概念和技术.C++是使用最为广泛的程序设计语言之一,其应用领域几乎没有局限.从大洋深处到火星表面,到处都能发现C++程序的身影.C++是由一个开放的国际标准组织全面考量.精心设计的.

《C++程序设计原理与实践》读书笔记(五)

拷贝 我们的vector类型具有如下形式: class vector {     private:     int sz;     double * elem; public:     vector(int s):sz(s),elem(new double[s]){}     ~vector() {delete [] elem;} }; 让我们试图拷贝其中的一个向量: void f(int n) {     vector v(3);     v.set(2, 2.2);     vector v

C++程序设计原理与实践 第十九章部分答案

1 #include <iostream> 2 #include <vector> 3 #include <string> 4 using namespace std; 5 6 template<class T> void f(vector<T>&v1,vector<T>&v2) //v2不设为const因为可能v2=v1 习题1 7 { 8 if(v1.capacity()<=v2.size()) 9 { 10