把《c++ primer》读薄(3-3 标准库bitset类型)

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

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

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

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

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

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

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

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

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

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

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

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

测出b对象里的1的个数

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

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

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

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

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

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

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

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

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

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

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

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

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

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

//取反操作

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

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

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

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

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

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

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

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

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

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

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

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

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

小结:

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

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

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

 

辛苦的劳动,转载请注明出处,谢谢……

http://www.cnblogs.com/kubixuesheng/p/4145203.html

时间: 2024-12-29 00:34:34

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

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

督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1:养成一个好习惯,在头文件中只定义确实需要的东西 using namespace std; //建议需要什么再using声明什么,最好不使用这个偷懒的写法 问题2:C++定义了一个内容丰富的抽象数据类型的标准库,最重要的两个标准库类型是string和vector 因为他们是c++基本内置类型基础上改进而来,故重要!前者支持变长字符串,后者可以保存一组指定类型的对象. 问题3:什么时候会调用默认的构造函数? 默认构造函数

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

督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 相关的内存,因为vetcor是类模版,对应多个不同类型,比如int,string,或者自己定义的数据类型等. 程序开头应如下声明 #include <iostream> #include <vector> #include <string> using std::strin

C++标准库string类型

string类型支持长度可变的字符串,C++标准库将负责管理与存储字符相关的内存,以及提供各种有用的操作.标准库string类型的目的就是满足对字符串的一般应用.  本文地址:http://www.cnblogs.com/archimedes/p/cpp-string.html,转载请注明源地址. 引入头文件#include<string> 1.string对象的定义和初始化 string标准库支持几个构造函数,构造函数是一个特殊成员函数 一下是几种初试化string对象的方式 string

C++标准库 bitset

有些程序要处理二进制位的有序集,每个位可能包含 0(关)1(开)值.位是用来保存一组项或条件 的 yes/no 信息(有时也称标志)的简洁方法.标准库提供的 bitset 类简化了位集的处理.要使用 bitset 类就必须包含相关的头文件.在本书提供的例子中,假设都使用 std::bitset 的using声明: #include <bitset> using std::bitset; bitset 对象的定义和初始化 下表列出了 bitset 的构造函数.类似于 vector,bitset

标准库function类型的使用

14.44编写一个简单的桌面计算器使其能处理二元运算. #include<iostream> #include<map> #include<functional> #include<string> using namespace std; int add(int a,int b) { return a+b; } struct divide{ int operator()(int denominator,int divisor) { return denomi

c++-C++ string类 标准库 字符串

问题描述 C++ string类 标准库 字符串 C++标准库提供了一个功能强大的String类来实现字符串的操作,本系统创建一个功能类似"String类"的小型字符串类,以实现类似的字符处理功能求大神帮解决用C++ 解决方案 http://zhidao.baidu.com/link?url=75L1-WX-G-cxzSWytaJDkPNRF23cR08MvvIGyUSSG5ykmN9bh-A-0IFWPGBMKoMYkPJ0luXNApuvYXYT0TJQKa 解决方案二: <

我国首份IP地理信息标准库发布

中国第一个<互联网IP地理信息标准库>,于3月3日正式向行业推出.这是由中国广告协会互动网络分会面向全行业正式发布的第一个<互联网IP地理信息标准库>. 该库的准确率达到85%以上,对中国大陆地区全部IPv4地址达到了98%覆盖率.标准库的投入使用将极大提升了我国互联网广告地域定向投放的精度,有效避免因IP混乱造成不必要的浪费,这将进一步推动中国互联网产业向精确化.标准化方向的发展,为实现互联网广告的精准投放奠定了基础.这是我国互联网广告标准化的又一重大进步. 据了解,本次参与标准

C标准库参考指南(1)assert.h

1.1 assert.h 断言头文件用于调试. 宏: assert(); 外部引用: NDEBUG 1.1. assert 声明: void assert(intexpression); 断言头文件中的宏允许你将一些特殊信息写入到标准错误文件. 如果表达式的值为0(false),那么表达式.源文件名和行号都会被发送给标准错误输出,并调用abort函数.如果标识符NDEBUG ("no debug")由#define NDEBUG定义,那么断言头文件中的宏就什么都不做. 标准错误输出的格

Java SE 8:标准库增强

Lambda表达式是Java SE 8的核心功能,大部分的改进都围绕lambda表达式展开.(Jigsaw项目已经被推迟到Java SE 9.)关于lambda表达式的内容,已经在上一篇文章中进行了说明.这篇文章主要介绍Java SE 8中包含的其他Java标准库的增强. 并行排序 随着多核CPU的流行,Java平台的标准库实现也尽可能利用底层硬件平台的能力来提高性能.Java SE 7中引入了Fork/Join框架作为一个轻量级的并行任务执行引擎.Java SE 8把Fork/Join框架用到