IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 位图介绍与实现 -> 正文阅读

[C++知识库]位图介绍与实现

位图的概念

位图的本质其实就是直接定值法的哈希,就是用每一个比特位来存放某种状态(通常用来表示该元素是否存在),由于表示每一个数据是否存在只需要使用一个比特位,其优点是节省空间,适用于海量数据,数据无重复的场景。

namespace ZJ
{
	template<size_t N>
	class BitSet//位图,解决不了字符串的情况
	{
	public:
		BitSet();
		void set(const size_t& val);//设置位
		void reset(const size_t& val);取消位
		bool test(const size_t& val)const;//检查该值是否在位图中存在
	public:
		std::vector<int> _bits;	//按位存储的哈希表
	};
}

位图的实现

构造函数

在我们使用位图时,首先要做的第一件事就是根据所需要N位数来创建N位的位图,并将所有的位图的所有位置都设置为0(即每一个位上表示的数据不存在)。
但是一个整形是有32个比特位的,因此用户输入N个位的位图就需要用到N/32个整形,但是实际我们所需要的整形个数是N/32+1,因为用户输入的位数可能小于1个整形所含盖的位数。
例如:当用户输入的位数是48位时,此时我们就需要创建两个整形(int),即需要 48 / 32 + 1 = 2,共计64个比特位。
在这里插入图片描述

		BitSet()
		{
			_bits.resize(N / 32 + 1, 0);
		}

set

set函数用于将某个值所映射的位置设置为存在状态,即对应的比特位设置为1。

设置x值对应到位图中指定的位的方法如下:

  1. 计算出该数(x)位于第 i 个整数的第 j 个比特位。
  2. 将1左移 j 位后与第 i 个整数进行或运算即可。

具体如下图所示:
在这里插入图片描述

		// 把x映射的位标记成1
		void set(size_t x)
		{
			assert(x < N);

			// 算出x映射的位在第i个整数
			// 算出x映射的位在这个整数的第j个位
			size_t i = x / 32;
			size_t j = x % 32;

			// _bits[i] 的第j位标记成1,并且不影响他的其他位
			_bits[i] |= (1 << j);
		}

reset

set函数用于将某个值所映射的比特置为不存在状态,即置为0。

清空x值对应到位图中指定的位的方法如下:

  1. 计算出该值对应位图当中第 i 个整数的第 j 个比特位。
  2. 将1左移 j 位再取反后与第 i 个整数进行与运算即可。

具体如下图所示:
在这里插入图片描述

		void reset(size_t x)
		{
			assert(x < N);

			size_t i = x / 32;
			size_t j = x % 32;

			// _bits[i] 的第j位标记成0,并且不影响他的其他位
			_bits[i] &= (~(1 << j));
		}

test

tes函数用于获取x值对应的比特位的数据是否存在。

获取位图中x值对应指定的位的状态的方法如下:

  1. 计算出该位位于第 i 个整数的第 j 个比特位。
  2. 将1左移 j 位后与第 i 个整数进行与运算得出结果。
  3. 若结果非0,则该位对应的数据存在,否则该不存在。

在这里插入图片描述

		bool test(size_t x)
		{
			assert(x < N);

			size_t i = x / 32;
			size_t j = x % 32;

			// 如果第j位是1,结果是非0,非0就是真
			// 如果第j为是0,结果是0,0就是假
			return _bits[i] & (1 << j);
		}

下期预告:C++11!!!

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-31 23:45:54  更:2022-03-31 23:49:24 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 2:01:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码