返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >使用C++实现位图处理
  • 313
分享到

使用C++实现位图处理

C++位图处理C++位图操作 2023-05-16 14:05:59 313人浏览 薄情痞子
摘要

目录位图的引入什么是位图位图的应用bitset的使用定义方式成员函数bitset的运算符重载赋值-关系-复合赋值-单目运算符[]重载位图的引入 无序的40亿个不重复的无符号整数,给一

位图的引入

无序的40亿个不重复的无符号整数,给一个无符号整数,如何判断一个数是否在这40亿个数中

方法1:遍历, 时间复杂度O(N)

方法2:排序—O(N*logN) + 二分查找----O(logN)

方法3:可以将所有数放到unordered_set中,然后调用find函数查找

上述的方法存在的问题:

  • 这里有40亿个数, 若是我们要将这些数全部加载到内存当中,那么将会占用16G的空间,空间消耗是很大的
  • 因此从空间消耗来看,上述的方法都是不可行的

方法4:利用位图解决

无符号整数总共有2^32个,因此记录这些数字就需要2^32个比特位,仅仅需要512M的内存空间,内存消耗大大减少

问:40亿个整数需要占用多少空间

1G =1024*1024*1024 Byte = 10亿字节,刚才存放一个整形4个字节,32个比特位,需要16G的空间,现在用一个比特位存,只需要16/32 = 0.5G即可

注意我们需要开辟42亿9千多万个比特位,而不是40亿个比特位,因为要映射,要按照整数的最大范围去开,而不是按个数去开 开辟内存的最小单位->字节->用char/int都可以

如何正确开辟42亿9前多万个比特位呢?

共有两种方式: bitset: template<size_t N> class bitset;

bitset<0xffffffff> bs;//#define UINT_MAX      0xffffffff
bitset<-1> bs; //-1的补码是全1 0xffffffff,而非类型模板参数的N的参数是size_t类型

什么是位图

所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景,通常是用来判断某个数据存不存在的

数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0代表不存在

例子:

位图的应用

  • 快速查找某个数据是否在一个集合
  • 排序
  • 求两个集合的交集、并集等
  • 操作系统中磁盘块标记
  • 内核中信号标志位(信号屏蔽字和未决信号集)

bitset的使用

定义方式

bitset ---> template <size_t N> class bitset; 位图的大小在编译时是固定的(由其模板参数确定)

  • 构造一个N位的位图,所有位都初始化为0
  • 构造一个N位的位图,根据所给值初始化位图的前n位
  • 构造一个N位的位图,根据字符串中的0/1序列初始化位图的前n位
#include<bitset>
int main()
{
	//方式1:构造一个N位的位图,所有位都初始化为0
	bitset<16> bs1;//0000 0000 0000 0000
	//方式2:构造一个N位的位图,根据所给值初始化位图的前n位
	bitset<16> bs2(0xabc);//0011 1101 0101 0000
	//方式3:构造一个N位的位图,根据字符串中的0/1序列初始化位图的前n位
	bitset<16> bs3(string("10110001"));//1000 1101 0000 0000
	return 0;
}

成员函数

成员函数功能
set设置指定位或所有位为1
reset清空指定位或所有位为0
flip反转指定位或所有位
test获取指定位的状态 0或者1
count获取被设置位的个数
size获取可以容纳的位的个数
any判断是否有位被设置–>如果有任何一个位被设置则返回true
none判断是否所有位都没有被设置->如果没有位被设置则返回true
all判断是否所有位都设置->如果所有位都被设置则返回true

使用实例:

#include<iOStream>
#include<bitset>
int main()
{
	//从右到左算起, 最右边为第0位
	bitset<8> bs;//构造一个8位的位图,所有位都初始化为0
	bs.set(1);//设置第1位为1
	bs.set(5);//设置第5位为1
	cout << bs << endl; //00100010
	bs.flip();//反转bs的所有位
	cout << bs << endl;//11011101
	cout << "共有"<<bs.count()<<"位被设置成1" << endl;//共有6位被设置成1
	cout << bs.test(3) << endl;//输出第3位的状态 - 1
	bs.reset(1);//将第1位设置为0
	cout << bs << endl;//11011101
	bs.flip(7);//将第7位反转
	cout << bs << endl;//01011101
	cout << bs.size() << endl;//输出位图可以容纳的位的个数 ---8
	cout << bs.any() << endl;//判断是否有位被设置 ---1
	bs.reset();//清空所有位
	cout << bs << endl;//00000000
	bs.set();//将所有位设置为1
	cout << bs << endl;//11111111
	cout << bs.all() << endl;//判断是否所有位都设置 ----1
	return 0;
}

注意如何区分成员函数set,reset,flip是对所有位操作还是对某一个位操作呢?

如果成员函数带了参数,就是对该指定的位操作如果没有指定,就是对所有位操作

bitset的运算符重载

>> 及 << 运算符

我们可以直接使用>><<运算符对biset容器对应的所有位进行输入输出操作

如果输入的位数比位图所能容纳的位数N多,只会从前向后截取N位

#include<bitset>
int main()
{
	bitset<8> bs;
	cin >> bs;//输入:10101
	cout << bs << endl;//00010101
	return 0;
}

赋值-关系-复合赋值-单目运算符

bitset容器对一些复合赋值运算符和单目运算符也进行了重载

  • 赋值运算符:=
  • 关系运算符:== !=
  • 复合赋值运算符:&= |= ^= <<= >>=
  • 单目运算符:~
#include<bitset>
int main()
{
	bitset<8> bs1(string("11111111"));
	bitset<8> bs2(string("01010101"));
	cout << bs1 << endl;//11111111
	bs1 >>= 1;
	cout << bs1 << endl;//01111111
	bs2 &= bs1;
	cout << bs2 << endl;//01010101
	return 0;
}

其次我们可以使用& | ^ 对位图进行操作

#include<bitset>
int main()
{
	bitset<8> bs1(string("10101111"));
	bitset<8> bs2(string("01101101"));
	cout << (bs1 | bs2) << endl;//11101111
	cout << (bs1 & bs2) << endl;//00101101
	cout << (bs1 ^ bs2) << endl;//11000010
	return 0;
}

[]重载

bitset容器中对[ ]运算符进行了重载,我们可以直接使用[ ]对指定位进行访问或修改

int main()
{
	bitset<8> bs(string("11001010"));
	cout << bs[0] << endl; //0
	bs[0] = 1;
	cout << bs << endl; //11001011
	return 0;
}

到此这篇关于使用c++实现位图处理的文章就介绍到这了,更多相关C++位图处理内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 使用C++实现位图处理

本文链接: https://lsjlt.com/news/210138.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 使用C++实现位图处理
    目录位图的引入什么是位图位图的应用bitset的使用定义方式成员函数bitset的运算符重载赋值-关系-复合赋值-单目运算符[]重载位图的引入 无序的40亿个不重复的无符号整数,给一...
    99+
    2023-05-16
    C++位图处理 C++位图操作
  • C++ 位图及位图的实现原理
    概念 位图就是bitmap的缩写,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,该数据都是不重复的简单数据。通常是用来判断某个数据存不存在的 例如:给40亿个不重复...
    99+
    2024-04-02
  • C语言位图及位图的实现
    本文实例为大家分享了C语言位图及位图的实现具体代码,供大家参考,具体内容如下 1.概念 位图(bitset)是一种常用的数据结构,常用在给一个很大范围的数,判断其中的一个数是不是在其...
    99+
    2024-04-02
  • C++位图怎么实现
    这篇文章给大家分享的是有关C++位图怎么实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概念位图就是bitmap的缩写,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,该数据都是不重复的简单数据...
    99+
    2023-06-15
  • C++位图的实现原理与方法
    概念 位图就是bitmap的缩写,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,该数据都是不重复的简单数据。通常是用来判断某个数据存不存在的 例如:给40亿个不重...
    99+
    2024-04-02
  • C++ opencv图像处理使用cvtColor实现颜色转换
    目录前言源码效果图代码颜色空间转换代码前言 在我们读取图像时通常会用到imread()函数,里面flags可以决定通道数,来得到我们想要的图像,比如: -1 按解码得到的方式读入图像...
    99+
    2024-04-02
  • C# 位图BitArray的使用
    前面聊了布隆过滤器,回归认识一下位图BitMap,阅读前文的同学应该发现了布隆过滤器本身就是基于位图,是位图的一种改进。 位图 先看一个问题, 假如有1千万个整数,整数范围在1到1亿...
    99+
    2024-04-02
  • C++中位图的实现示例
    这篇文章主要介绍C++中位图的实现示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!概念位图就是bitmap的缩写,所谓bitmap,就是用每一位来存放某种状态,适用于大规模数据,该数据都是不重复的简单数据。通常是用...
    99+
    2023-06-15
  • C# Bitmap图像处理加速的实现
    目录BitmapData类传统代码使用BitmapData的代码效率对比代码GPU加速生成Dll调用Dll耗时BitmapData类 BitmapData类专门用于位图处理,与Bit...
    99+
    2024-04-02
  • C语言中位图怎么实现
    这篇文章主要介绍C语言中位图怎么实现,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!本文实例为大家分享了C语言位图及位图的实现具体代码,供大家参考,具体内容如下1.概念位图(bitset)是一种常用的数据结构,常用在给...
    99+
    2023-06-15
  • c++图像处理库怎么使用
    在C++中,有一些流行的图像处理库可以使用。以下是一些常见的图像处理库及其使用方法: OpenCV:OpenCV是一个广泛使用的...
    99+
    2023-10-24
    c++
  • 怎么使用Flutter+Metal实现图像处理
    这篇“怎么使用Flutter+Metal实现图像处理”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用Flutter+M...
    99+
    2023-07-02
  • C++使用链表实现图书管理系统
    本文实例为大家分享了vue + element ui实现锚点定位的具体代码,供大家参考,具体内容如下 一、程序实现功能 1.录入书籍:将书籍录入图书管理系统 2.浏览书籍:查看图书管...
    99+
    2024-04-02
  • C语言实现BMP图像细化处理
    细化(thinning)算法有很多,我们在这里介绍的是一种简单而且效果很好的算法,用它就能够实现从文本抽取骨架的功能。我们的对象是白纸黑字的文本,但在程序中为了处理的方便,还是采用 ...
    99+
    2024-04-02
  • C#图片处理如何生成缩略图的实现
    缩略图通常是将图片内容进行一定的缩小展现,或裁剪展现,主要有两个目的,一是提供一定的预览功能,二是节省屏幕展示空间、节省流量。在网站中我们通常运用在商品的列表,比如商城、图书、新闻等...
    99+
    2023-02-07
    C# 生成缩略图 C# 图片缩略图
  • C语言实现BMP图像处理(彩色图转灰度图)
    我们知道真彩图不带调色板,每个象素用 3 个字节,表示 R、G、B 三个分量。所以处理很简单,根据 R、G、B 的值求出 Y 值后,将 R、G、B 值都赋值成 Y,写入新图即可。 在...
    99+
    2024-04-02
  • C#中如何实现Bitmap图像处理加速
    这篇文章主要讲解了“C#中如何实现Bitmap图像处理加速”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#中如何实现Bitmap图像处理加速”吧!BitmapData类BitmapData...
    99+
    2023-06-25
  • C语言实现BMP图像开运算处理
    开运算可以把比结构元素小的特定图像细节出去,同时保证不产生全局的几何失真。滤掉比结构元素小的突刺,切断细长搭接而起到分离作用。 运算:用B开启A就是选出了A中某些与B相匹配的点,这些...
    99+
    2024-04-02
  • C语言实现BMP图像闭运算处理
    闭运算可以把比结构元素小的特定图像细节出去,同时保证不产生全局的几何失真。填充比结构元素小的缺口或孔,搭接短的间断而起到连接作用。 运算:也就是先膨胀后腐蚀。 #include ...
    99+
    2024-04-02
  • C++ opencv图像处理实现图片边缘检测示例
    目录边缘检测简介一、边缘检测步骤二、Canny1.函数2.代码二、Sobel1.函数2.代码三、Scharr1.函数2.代码四、Laplacian1.函数2.代码总结边缘检测简介 边...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作