位图的详细讲解

位运算操作符:或,与,异或,按位取反。

操作符
| 两个中有一个是一则为一
& 两个都是一则为一
^ 相同为零,不同为一
~ 变成一,一变成零

什么是位运算符:

位运算是直接对整型数据的二进制进行运算。

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

位图的详细讲解_第1张图片

位图的实现(通过上面的位运算操作符来实现位图的存储)

#include
using namespace std;
#include


class bitset
{
public:
	bitset(size_t x)
		:_bit((x >> 5) + 1,0)//>>5 相当于除32 +1防止余数漏掉 将所有未初始化0 
		,_nums(x)
	{

	}
	//将which所对应的bit位设置为1
	void set(size_t which)
	{
		if (which > _nums)
		{
			return;
		}
		size_t index = which / 32;
		size_t pos = which % 32;
		_bit[index] |= (1 << pos);
	}
	//将which位置的bit位设置为0
	void reset(size_t which)
	{
		if (which > _nums)
		{
			return;
		}
		size_t index = which / 32;
		size_t pos = which % 32;
		_bit[index] &= ~(1 << pos);
	}
	//检测which位置是否存在
	bool check(size_t which)
	{
		if (which > _nums)
		{
			return false;
		}
		size_t index = which / 32;
		size_t pos = which % 32;
		return _bit[index] & (1 << pos);
	}
	//获取比特位的总个数
	size_t size()const
	{
		return _nums;
	}

private:
	vector _bit;
	size_t _nums;
};

 代码测试:

int main()
{
	bitset a(32);
	a.set(16);
	a.set(2);
	a.set(31);
	a.set(8);
	return 0;
}

测试结果:

位图的详细讲解_第2张图片

 位图的应用


1. 快速查找某个数据是否在一个集合中
2. 排序 + 去重
3. 求两个集合的交集、并集等
4. 操作系统中磁盘块标记

 面试题


给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在
这40亿个数中。【腾讯】
1. 遍历,时间复杂度O(N)
2. 排序(O(NlogN)),利用二分查找: logN
3. 位图解决
数据是否在给定的整形数据中,结果是在或者不在,刚好是两种状态,那么可以使用一
个二进制比特位来代表数据是否存在的信息,如果二进制比特位为1,代表存在,为0
代表不存在。比如

你可能感兴趣的:(c++练习,数据结构,算法,c++,算法,开发语言)