位图的详细讲解

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

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

什么是位运算符:

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

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

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

#include<iostream>
using namespace std;
#include<vector>


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<int> _bit;
	size_t _nums;
};

 代码测试:

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

测试结果:

 位图的应用


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

 面试题


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ESP32-S3是一款集成了Wi-Fi和蓝牙的芯片,可以用于物联网和智能家居等应用。而LVGL是一款开源的GUI库,支持多种平台和语言,可以用于嵌入式系统和桌面应用等场景。在ESP32-S3上使用LVGL可以实现图形化界面的开发。 LvglFontTool是LVGL官方提供的一款字体工具,可以用于生成LVGL所需的字体文件。在ESP32-S3上使用中文字库需要先将中文字体转换为LVGL支持的格式,然后再通过LVGL API进行绘制。 以下是在ESP32-S3上使用LVGL实现中文显示的步骤: 1. 下载并安装LvglFontTool。 2. 选择一款中文字体,并将其转换成LVGL支持的格式。可以使用如下命令: ``` python lv_font_conv.py -f simsun.ttc -r 0x4E00-0x9FFF -s 16 -b 1 -t lvgl -o simsun_16.c ``` 其中,-f指定字体文件,-r指定需要转换的字符范围,-s指定字号,-b指定是否加粗,-t指定转换成LVGL格式,-o指定输出文件名。 3. 在ESP32-S3上创建LVGL工程,添加生成的字体文件(simsun_16.c)到工程中。 4. 使用LVGL API进行中文显示。可以使用lv_label_create函数创建标签控件,然后使用lv_label_set_text函数设置文本内容,如下: ``` lv_obj_t *label = lv_label_create(lv_scr_act(), NULL); lv_label_set_text(label, "你好,世界!"); ``` 易错点: 1. 字体文件的生成和导入需要仔细检查,确保没有错误和遗漏。 2. 在ESP32-S3上使用LVGL API时,需要注意API的使用方法和参数设置,可以参考LVGL的官方文档。 3. 在中文显示时,需要注意字符编码的问题,确保字符编码与字体文件中的编码一致。 4. 在使用LVGL的控件时,需要注意控件的大小和位置,确保能够正常显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸡爱玩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值