督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正。

//开头
#include <bitset>
using std::bitset;

问题1、标准库bitset类型(模版)

需要处理二进制位的时候,可以使用c++标准库提供的bitset类型,它也是类模版,类似vectro容器,唯一不同的是,bitset类型需要说明长度,使用常量表达式给出的整型字面值或者已经初始化的cosnt对象。

    bitset<> bit;//从0到31位算的,bit的32位每位初始化为0

使用无符号的值初始化bitset对象,该值被初始化为二进制序列,如果无符号值长度小于bitset对象,那么就把高阶位截掉

    bitset<> bit1(0xffff);//0-15位都是1
bitset<> bit2(0xffff);//0-15位是1,16-31是0
bitset<> bit3(0xffff);//32-127位都是0
bitset<> bit0(0xffff);//高位被截去

问题2、使用string对象初始化bitset对象需要注意的问题

使用string对象初始化bitset对象的时候,直接初始化为二进制序列,从string字符串对象的右边开始读取!!

     string str1("");
//bit1对象的0-3位为0001,其余高位为0
bitset<> bit1(str1);
//一定注意起来,string对象和bitset对象的转换是反向的!也就是string对象的下标最大的(右边)开始读取到bitset对象里面 //还可以这样初始化
string str2("");
//从str2字符串对象的第5位开始的4位,初始化bit2对象
//即:1100
//从右边读取(string对象的高位读取,那么就是0011存储在bit2对象里的0-3位)
bitset<> bit2(str2, , );//其他二进制位数都是0 //如果省略第三个参数,就是从指定位置到末尾
string str3("");
//从str3字符串对象的第2位开始到末尾
//
bitset<> bit3(str3, );//存储在bit3对象里0-5位的是000100

问题3、bitset对象的常见操作

    bitset<> b(0x0000);
//如果b里的位序含有1,那么返回true
if (b.any())
{
cout << "执行!" << endl;//没有被执行,返回的是false
}

测出b对象里的1的个数

cout << b.count() << endl;//

注意,count函数返回的值是size_t类型,定义在头文件cstddef中,c里是stddef.h,size_t是一个无符号的和机器无关的整型。类似无符号int类型

size_t num = b.count();//ok

下面这样虽然不报错,但是以前说过类似的问题,不建议使用,这里就看成是错的

//int num2 = b.count();

类似容器vector或者string类型,bitset也有求长度的函数size()

    cout << b.size() << endl;//打印32,说明求的是实际定义的时候规定的长度
//同样返回的是size_t类型
size_t num1 = b.size();

//访问bitset对象里的位,大同小异,类似其他容器或者标准库,数组的下标操作

    bitset<> bit;//自动默认初始化为32个0
//循环,这里的i使用int类型定义,因为这里的bitset对象的长度是使用的32,也就是int类型定义的
for (int i = ; i != ; i++)
{
bit[i] = ;//32位。0-31全部初始化为1
}

//测试bitset对象某一位是不是1

    bitset<> bit1(0x1000);
if (bit.test())
{
cout << "执行" << endl;//执行!说明第一位是1
}

//或者直接使用下标操作的返回值

    cout << bit1[] << endl;//打印0,对应false
//那么自然可以直接拿来做bool判断了,因为它无非就是返回0或者1啊

//把所有二进制位数都设置为1

    bit1.set();
cout << bit1.count() << endl;//

//只是把第1位设置为1

    bitset<> bit2(0x0000);
bit2.set();
cout << bit2.count() << endl;//
cout << bit2.any() << endl;//

//把所有二进制位都设置为0

    bit2.reset();
cout << bit2.count() << endl;//

//同样,只是设置某位为0

    bitset<> bit3(0x1111);
cout << bit3.count() << endl;//
bit3.reset();
cout << bit3.count() << endl;//

//取反操作

    bitset<> bit4(0x0000);
cout << bit4.count() << endl;//
bit4.flip();//对所有的位数按位取反
cout << bit4.count() << endl;//

//同样,类似操作,只对某一位取反

    bit4.flip();//对第一位取反

//当且仅当,bitset对象的长度小于或者等于无符号long整型的变量时,可以使用如下函数

    unsigned long ln = bit4.to_ulong();//ok
//否则报错,出现异常

问题4、一定注意,bitset对象的下标问题,是从右边开始的!

    //直接输出bitset对象
bitset<> bit5(0xffff);
cout << bit5 << endl;

    bitset<> bit(0xffff);
cout << bit << endl;

一定注意,下标从右边开始是0-31,不是传统的左边开始了

从右边开始0-15为1,其余高位0填充。

问题5、如题,bitset<32> bit(1010101),初始化bit的结果是什么?

    bitset<> bit();
//注意,这样初始化,默认1010101是十进制!先转换为二进制:
//000000000000011110110100110110101
//然后初始化bit对象为二进制序列

千万不要想当然的认为,这是写1010101就是二进制,其实默认的是十进制形式

小结:

c++标准库定义的数组和指针等属于低级的抽象数据类型,而标准库的容器比如vector,还有标准库bitset类模版,string类型等,都是高级的抽象数据类型!其中,string类型提供了变长的字符串存储操作,vector容器提供了对某总类型的对象的存储操作。

还有学到的迭代器,提供了间接访问容器内对象的方法(可以代替下标)。比如访问和遍历vector容器内对象或者string类型的元素。

记住,优秀的c++程序员,应该习惯使用高级抽象数据类型,尽量避免使用低级的数组还有指针。除非是强调程序运行的速度的模块,那样就应该使用低级的复合数据类型,指针或者数组。

欢迎关注

dashuai的博客是终身学习践行者,大厂程序员,且专注于工作经验、学习笔记的分享和日常吐槽,包括但不限于互联网行业,附带分享一些PDF电子书,资料,帮忙内推,欢迎拍砖!

把《c++ primer》读薄(3-3 标准库bitset类型)的更多相关文章

  1. 把《c++ primer》读薄(3-1 标准库string类型初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1:养成一个好习惯,在头文件中只定义确实需要的东西 using namespace std; //建议需要什么再using声 ...

  2. C++标准库bitset类型(简单使用方法)

    转自此人博客 ```cpp #include<bister> using std::bitset; ``` 一句话定义:可自定义位数,用作记录二进制的数据类型. 一,定义和初始化 ```c ...

  3. 把《c++ primer》读薄(3-2 标准库vector容器+迭代器初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 ...

  4. C++ primer读书笔记 chapter3 标准库类型

    除第二章介绍的是C++的基本类型,本章将大致介绍一下C++定义的内容丰富的抽象数据库类型标准库.着重介绍一下sting.vector和bitset. 3.2标准库string类型 1.string类型 ...

  5. C++ Primer学习笔记2--c++标准库中的 vector、string 和 bitset 类型

    一.string    #include <string>  using std::string    初始化函数:    string s1;        默认构造函数 s1 为空串 ...

  6. C++primer第三章标准库类型

    除第二章介绍的基本数据类型外,C++ 还定义了一个内容丰富的抽象数据类型标准库. 本章将介绍标准库中的 vector.string 和 bitset 类型. string 类型支持长度可变的字符串 v ...

  7. C++ Primer 学习笔记_6_标准库类型 -- 命名空间using与string类型

     标准库类型(一) --命名空间using与string类型 引: 标准库类型是语言组成部分中更主要的哪些数据类型(如:数组.指针)的抽象! C++标准库定义的是高级的抽象数据类型: 1.高级:由 ...

  8. c++ primer 第三章 标准库类型

    1. string 标准库 1.1初始化 string s1; 默认构造函数s1为空 string s2(s1); 将s2初始化为s1的一个副本 string s3("value" ...

  9. 【C++ Primer每日刷】之三 标准库 string 类型

    标准库 string 类型 string 类型支持长度可变的字符串.C++ 标准库将负责管理与存储字符相关的内存,以及提供各种实用的操作.标准库string 类型的目的就是满足对字符串的一般应用. 与 ...

随机推荐

  1. HTML5将图片转化成字符画

    HTML5将图片转化成字符画 字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢?HTML5让这个可能变成了现实,通过canvas,可以很轻松实现这个功能.其实原理很简单:扫描图片相应位置 ...

  2. C++哈夫曼树编码和译码的实现

    一.背景介绍: 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的 ...

  3. Android四大组件--MediaPlayer详解(转)

    一. MediaPlayer 状态机 介绍 Android MediaPlayer 状态即图例 : 1. Idle (闲置) 状态 和 End (结束) 状态 MediaPlayer 对象声明周期 : ...

  4. linux 中部署ant编译的包中缺少问题

    今天遇到在window上部署ant编译的包,能运行正常,但部署在linux中出现跳不进jsp中,出现404问题,后来经过排查在jsp中<%@taglib prefix="c" ...

  5. C# DataSet

    一.基本概念 DataSet是ADO.NET的中心概念.可以把DataSet当成内存中的数据库,DataSet是不依赖于数据库的独立数据集合.所谓独立,就是说,即使断开数据链路,或者关闭数据库,Dat ...

  6. Backbone源码分析(一)

    距离上一篇博客有一段时间了,期间各种琐事萦绕.最主要的一件是,当我差不多将整个dojo核心源码看完,惊讶的发现dojo1.*的设计以是老态龙钟之象,而我沉溺在dojo中太久,已经不知道前端世界变成了什 ...

  7. iOS开发系列--Objective-C之类和对象

    概述 前面已经简单介绍过ObjC的基础知识,让大家对ObjC有个大致的印象,今天将重点解释ObjC面向对象的特性.ObjC相对于C语言多了面向对象特性,但是ObjC又没有其他面向对象语言那么多语法特性 ...

  8. 高质量,高效率的多国语言软件开发(Web/PC/Mobile),使用接口约束/调用不同语言资源

    偶然间翻出了几年前写的一个小程序,把当时的资料整理整理分享一下. 当时为了给自己的软件实现多国语言功能,而开发的辅助工具:SE String Resource. 这是当时基于自己另一款 IDE 软件抽 ...

  9. 程序猿尤其是.NET程序员所需要注意的网站资源

    我觉得一个程序员 需要 对 技术 和 行业 两方面同时具有极大热情和注意力才能让自己在一个新的台阶. 有些程序员就是对技术有着极大的热情但是行业完全不注意,这样我感觉只能成为一个专家,并不能让自己真正 ...

  10. 在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure

    [题外话] 上次介绍了VS上开发Node.js的插件Node.js Tools for Visual Studio(NTVS),其提供了非常方便的开发和调试功能,当然很多情况下由于平台限制等原因需要在 ...