把《c++ primer》读薄(3-3 标准库bitset类型)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正。
//开头
#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类型)的更多相关文章
- 把《c++ primer》读薄(3-1 标准库string类型初探)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1:养成一个好习惯,在头文件中只定义确实需要的东西 using namespace std; //建议需要什么再using声 ...
- C++标准库bitset类型(简单使用方法)
转自此人博客 ```cpp #include<bister> using std::bitset; ``` 一句话定义:可自定义位数,用作记录二进制的数据类型. 一,定义和初始化 ```c ...
- 把《c++ primer》读薄(3-2 标准库vector容器+迭代器初探)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 ...
- C++ primer读书笔记 chapter3 标准库类型
除第二章介绍的是C++的基本类型,本章将大致介绍一下C++定义的内容丰富的抽象数据库类型标准库.着重介绍一下sting.vector和bitset. 3.2标准库string类型 1.string类型 ...
- C++ Primer学习笔记2--c++标准库中的 vector、string 和 bitset 类型
一.string #include <string> using std::string 初始化函数: string s1; 默认构造函数 s1 为空串 ...
- C++primer第三章标准库类型
除第二章介绍的基本数据类型外,C++ 还定义了一个内容丰富的抽象数据类型标准库. 本章将介绍标准库中的 vector.string 和 bitset 类型. string 类型支持长度可变的字符串 v ...
- C++ Primer 学习笔记_6_标准库类型 -- 命名空间using与string类型
标准库类型(一) --命名空间using与string类型 引: 标准库类型是语言组成部分中更主要的哪些数据类型(如:数组.指针)的抽象! C++标准库定义的是高级的抽象数据类型: 1.高级:由 ...
- c++ primer 第三章 标准库类型
1. string 标准库 1.1初始化 string s1; 默认构造函数s1为空 string s2(s1); 将s2初始化为s1的一个副本 string s3("value" ...
- 【C++ Primer每日刷】之三 标准库 string 类型
标准库 string 类型 string 类型支持长度可变的字符串.C++ 标准库将负责管理与存储字符相关的内存,以及提供各种实用的操作.标准库string 类型的目的就是满足对字符串的一般应用. 与 ...
随机推荐
- jQuery extend扩展String原型
jQuery.extend(String.prototype, { isPositiveInteger:function(){ return (new RegExp(/^[1-9]\d*$/).tes ...
- 在发送ajax请求时加时间戳或者随机数去除js缓存
在发送ajax请求的时候,为了保证每次的都与服务器交互,就要传递一个参数每次都不一样,这里就用了时间戳 大家在系统开发中都可能会在js中用到ajax或者dwr,因为IE的缓存,使得我们在填入相同的值的 ...
- CSS3总结
1.圆角效果 border-radius: 1px 1px 1px 1px; /* 四个半径值分别是左上角.右上角.右下角和左下角.顺时针 */ 右边半圆 div.right-circle{ hei ...
- Xamarin的不归路-安卓模拟器启动慢&没有虚拟键盘
1.启动慢解决方案:参考这篇文章进行配置 http://www.360doc.com/content/13/1002/18/532901_318605525.shtml 2.模拟器没有虚拟键盘解决方案 ...
- Java_equals和“==”的区别
1. 对于基本数据类型 它们的比较,应该用“==”,比较的是他们的值. 2. 引用数据类型 “==”判断的是对象是否为同一个,也就是它们内存中的存放地址是否一样,一样,则返回true,否则返回fals ...
- phpcms v9常用方法
1.联动菜单根据地区id显示地区名称的方法: 显示效果: 四川 >> 攀枝花 >> 仁和区 [字段名字为 area] {get_linkage($info['area'],1, ...
- Spring之注入的几种方式
普通注入 在配置文件里 <!-- 构造注入 --> <bean id="user1" class="entity.User"> < ...
- c#多线程介绍(上)
转载原文:这里是链接内容 转载原文:这里写链接内容 转载原文:这里写链接内容 (重要事情说三遍) 引言 本文主要从线程的基础用法,CLR线程池当中工作者线程与I/O线程的开发,并行操作PLINQ等多个 ...
- 在iOS中使用ZXing库[转]
前言 ZXing(Github镜像地址)是一个开源的条码生成和扫描库(开源协议为Apache2.0).它不但支持众多的条码格式,而且有各种语言的实现版本,它支持的语言包括:Java, C++, C#, ...
- 让pv3d(papervision3D)支持单帧前进、后退(nextFrame)。
下载最新的源码,找到animationController. 修改如下: package org.papervision3d.core.controller { import flash.events ...