bitset位图讲解

bitset可以用来处理位图问题,用位可以大大减少占用的空间内存,但是位图问题适合处理不重复的,在一定范围内的整数问题。用两个位图可以处理只出现一次问题

#include <bitset>

bitset<N> bit;//初始化会默认都为0。

bitset用法

bitset<N>最大支持到多少?

理论上只要内存够大就可以,跟数组一样

细节补充,暂时还用不到,当作了解

3.5.1  bitset的定义和初始化

表3-6列出了bitset的构造函数。类似于vector,bitset类是一种类模板;而与vector不一样的是bitset类型对象的区别仅在其长度而不在其类型。在定义bitset时,要明确bitset含有多少位,须在尖括号内给出它的长度值:

bitset<32> bitvec; //32位,全为0。

给出的长度值必须是常量表达式(2.7节)。正如这里给出的,长度值必须定义为整型字面值常量或是已用常量值初始化的整数类型的const对象。

这条语句把bitvec定义为含有32个位的bitset对象。和vector的元素一样,bitset中的位是没有命名的,程序员只能按位置来访 问它们。位集合的位置编号从0开始,因此,bitvec的位序是从0到31。以0位开始的位串是低阶位(low-order bit),以31位结束的位串是高阶位(high-order bit)。

bitset<n> b; 
b有n位,每位都为0

bitset<n> b(u); 
b是unsigned long型u的一个副本

bitset<n> b(s); 
b是string对象s中含有的位串的副本

bitset<n> b(s, pos, n); 
b是s中从位置pos开始的n个位的副本

1. 用unsigned值初始化bitset对象

当用unsigned
long值作为bitset对象的初始值时,该值将转化为二进制的位模式。而bitset对象中的位集作为这种位模式的副本。如果bitset类型长度大
于unsigned long值的二进制位数,则其余的高阶位置为0;如果bitet类型长度小于unsigned
long值的二进制位数,则只使用unsigned值中的低阶位,超过bitet类型长度的高阶位将被丢弃。

在32位unsigned long的机器上,十六进制值0xffff表示为二进制位就是十六个1和十六个0(每个0xf可表示为1111)。可以用0xffff初始化bitset对象:

// bitvec1 is smaller than the initializer

bitset<16> bitvec1(0xffff);          // bits 0 ... 15 are set to 1

// bitvec2 same size as initializer

bitset<32> bitvec2(0xffff);          // bits 0 ... 15 are set to 1; 16 ... 31 are 0

// on a 32-bit machine, bits 0 to 31 initialized from 0xffff

bitset<128> bitvec3(0xffff);         // bits 32 through 127 initialized to zero

上面的三个例子中,0到15位都置为1。由于bitvec1位数少于unsigned
long的位数,因此bitvec1的初始值的高阶位被丢弃。bitvec2和unsigned
long长度相同,因此所有位正好放置了初始值。bitvec3长度大于32,31位以上的高阶位就被置为0。

2. 用string对象初始化bitset对象

当用string对象初始化bitset对象时,string对象直接表示为位模式。从string对象读入位集的顺序是从右向左:

string strval("1100");

bitset<32> bitvec4(strval);

bitvec4的位模式中第2和3的位置为1,其余位置都为0。如果string对象的字符个数小于bitset类型的长度,则高阶位将置为0。

string对象和bitset对象之间是反向转化的:string对象的最右边字符(即下标最大的那个字符)用来初始化bitset对象的低阶位(即下标为0的位)。当用string对象初始化bitset对象时,记住这一差别很重要。

不一定要把整个string对象都作为bitset对象的初始值。相反,可以只用某个子串作为初始值:

string str("1111111000000011001101");

bitset<32> bitvec5(str, 5, 4); // 4 bits starting at str[5], 1100

bitset<32> bitvec6(str, str.size() - 4);     // use last 4 characters

这里用str中从str[5]开始包含四个字符的子串来初始化bitvec5。照常,初始化bitset对象时总是从子串最右边结尾字符开始
的,bitvec5的从0到3的二进制位置为1100,其他二进制位都置为0。如果省略第三个参数则意味着取从开始位置一直到string末尾的所有字
符。本例中,取出str末尾的四位来对bitvec6的低四位进行初始化。bitvec6其余的位初始化为0。这些初始化过程的图示如下:

多种bitset操作(表3-7)用来测试或设置bitset对象中的单个或多个二进制位:

表3-7  bitset操作
b.any() 
b中是否存在置为1的二进制位?

b.none() 
b中不存在置为1的二进制位吗?

b.count() 
b中置为1的二进制位的个数

b.size() 
b中二进制位的个数

b[pos] 
访问b中在pos处的二进制位

b.test(pos) 
b中在pos处的二进制位是否为1?

b.set() 
把b中所有二进制位都置为1

b.set(pos) 
把b中在pos处的二进制位置为1

b.reset() 
把b中所有二进制位都置为0

b.reset(pos) 
把b中在pos处的二进制位置为0

b.flip() 
把b中所有二进制位逐位取反

b.flip(pos) 
把b中在pos处的二进制位取反

b.to_ulong() 
用b中同样的二进制位返回一个unsigned long值

os << b 
把b中的位集输出到os流

. 输出二进制位

可以用输出操作符输出bitset对象中的位模式:

bitset<32> bitvec2(0xffff); // bits 0 ... 15 are set to 1; 16 ... 31 are 0

cout << "bitvec2: " << bitvec2 << endl;

输出结果为:

bitvec2: 00000000000000001111111111111111

bitset位图讲解

时间: 2024-10-11 08:26:07

bitset位图讲解的相关文章

一个用于白名单服务的布隆过滤器(bloom filter)

bloom filter这种数据结构用于判断一个元素是否在集合内,当然,这种功能也可以由HashMap来实现.bloom filter与HashMap的区别在于,HashMap会储存代表这个元素的key自身(如key为"IKnow7",那么HashMap将存储"IKnow7"这12个字节(java),其实还需要包括引用大小,但java中相同string只存一份),而bloom filter在底层只会使用几个bit来代表这个元素.在速度上,bloom filter对比

STL (1)vector

感觉自己对STL的很多东西还是不够明确,趁这个机会把这些内容整理一下,顺便明确化一些模糊的点. STL六大组件 容器,算法,迭代器,仿函数,适配器,分配器.   基本也是按照常用顺序排列 容器,现在理解起来就是数据的组织方式. 数组,原生数组 vector用于替代原数组,一定程度上解决了数组开大了浪费,开小了不够的问题.vector实现动态增加的方式很简单,大小不够了,就重新拷贝到一块新的更大的空间,默认是1.5倍原大小 注意:vector内部自动扩容的时候会将原空间析构,重新开辟的新空间会拷贝

Path相关方法讲解(二)

今天咱们一起来看看Path里 XXXTo 相关的一类方法: 通过 Path相关方法讲解(一),我们已经对 Path 有了一个很基本的了解,我们已经知道Path代表一条路径,而这条路径具体表现成什么样,我们自己可以自由发挥,随意构建,今天我们就一起来看看android给我们提供了哪些方法来构建路径: 一.moveTo(float,float) 用于移动路径的起始点到Point(x,y),咱们都知道对于android系统来说,屏幕的左上角的坐标是 (0,0) , 我们在做一些操作的时候默认基准点也是

第一章:位向量/位图

1.位图排序 //1.关闭所有位,初始化集合为空 for i=[0,n) bit[i]=0; //2.读取文件,打开相应的位,建立集合 for each i in the input file bit[i]=1; //3.检查每个位,如果某个位为1,就写出相应的数,从而创建已排序的文件 for i=[0,n) if(bit[i]) write i to the output file 2.位图的实现 2.1 #define BITSPERWORD 32 #define SHIFT 5 #defi

性能测试进阶指南——基础篇一(系统资源的讲解)

本文旨在帮助测试人员对性能测试常用指标做一个简单的讲解,主要包括CPU.内存.磁盘和网络带宽等系统资源,本文仅仅局限于Linux系统,Windows Server系统暂不做考虑. 一.系统资源的分析 Linux下的系统资源主要记录在内核文件/proc中,下面几乎记录了Linux所有的系统信息. 1.CPU 1.1 CPU的文件系统 CPU的基本信息在目录cpuinfo下可以查看,基于不同指令集(ISA)的CPU产生的/proc/cpuinfo文件不一样,基于X86指令集CPU的/proc/cpu

集合的检索:位图法

位图法 位图法是一种逻辑上很巧妙的描述集合的方法. 如集合S={2,4,1,5,12},它用位图描述就是 0110 1100 0000 1000,两个字节即可描述S,左边是低阶位.用bitset<16>存储的话就是{[15].[14]....[1].[0]}={0001000000110110}. 用位图对集合进行描述后,就很方便进行集合的运算,如交.并和差. 下面来演示具体操作 集合S={1,2,4,5},集合T={2,5,8,10} 集合S的位图是 0110110000000000 集合T

海量数据处理第二谈-----位图BitMap

位图的概念: 在C++中,位图是以位来表示整数的结构,普通的整数一个数需要用4个字节来表示,我们可以换种思想,在整个整数的集合范围内,某个整数存在与否,只有两种情况,在或者不在,那么,我们可以考虑只用一个bit位,来表示该整数存在的状态,从而达到节省内存的目的. 位图实例分析: 给一个实际的例子,给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中 我们可以简单计算一下,40亿个整数全部放到内存,需要160亿个字节,粗略计算,大致

Bitmap 位图

1.  概述 位图(bitmap)是一种非常常用的结构,在索引,数据压缩等方面有广泛应用.本文介绍了位图的实现方法及其应用场景. 2. 位图实现 (1)自己实现 在位图中,每个元素为"0"或"1",表示其对应的元素不存在或者存在. #define INT_BITS sizeof(int) #define SHIFT 5 // 2^5=32 #define MASK 0x1f // 2^5=32 #define MAX 1024*1024*1024 //max num

数据结构之位图

1.  概述 位图(bitmap)是一种非常常用的结构,在索引,数据压缩等方面有广泛应用.本文介绍了位图的实现方法及其应用场景. 2. 位图实现 (1)自己实现 在位图中,每个元素为“0”或“1”,表示其对应的元素不存在或者存在. 1 #define INT_BITS sizeof(int) 2 #define SHIFT 5 // 2^5=32 3 #define MASK 0x1f // 2^5=32 4 #define MAX 1024*1024*1024 //max number 5 i