什么是Bitmap?

Bitmap是什么?

Bitmap是一种内存高效的、存储布尔值信息的数据结构。在Bitmap中,每个位(Bit)都被视为一个独立的开关,可以表示0或1。
由英文即可看出,Bitmap 是一个合成词,由 Bit 和 Map 组合而成 (Bitmap = Bit + Map),用于将一系列表示有/无(是/否)状态的二值组织起来的一种数据结构(Bit,表示计算机科学中的最小单位 (即: 0 或 1),在逻辑上可以表示为 “是/否” 或 “有/无”;Map,表示一种组织事物的特定方式。)
在《编程珠玑》中,对Bitmap的定义为:所谓的Bitmap就是用一个bit位来标记某个元素对应的VALUE,而KEY即是该元素。由于采用了Bit为单位来存储数据,因此可以大大节省存储空间。
一句话:Bitmap本质可以理解成bit数组,其中每一个bit用来表示某个元素的VALUE值,这个值,要么是0,要么是1。

使用场景

(1). 海量连续数字的排序、去重。
(2). 用于需要保存海量的是/否信息的场景,或者可以转换为保存是/否信息的场景。
如:用户是否点赞,用户是否签到,用户是否登录,日活用户,访问计数,在线用户数等等。
1. 判断用户登录:需要一个KEY(这个场景下KEY可以随意设计),VALUE是一个用户ID所对应的位上、由0/1表示的位数组。每个用户ID对应一个位,当用户登录时,将用户ID对应的位设为1,退出登录时将其对应的位设为0。

2. 判断用户打卡:用日期作为KEY,VALUE是一个在当前日期下用户ID所对应的位上、由0/1表示的位数组。如果在当前日期下,用户已打开,则将用户ID对应的位置为1,未打卡的用户ID所对应的位的值不变(初始化时所有的位都置为0)。

3. 判断用户是否领取优惠券:优惠券的唯一标识作为KEY,VALUE是一个用户ID所对应的位上、由0/1表示的位数组。如果用户已领取,则将用户ID对应的位置为1,未领取的用户ID所对应的位的值不变(初始化时所有的位都置为0)。

优缺点

Bitmap在数据稠密的时候,非常节省空间,但是在数据稀疏的时候,会有极大的浪费。

如:我们知道一个int型的整型数字,存储在内存中是占4个字节,一个字节是8bit,假设存储一个数字10,用一个int型数组 int[1] 表示的话,就是 148=32 bit,在内存中占 32个bit位。如果是使用 Bitmap存呢?32个bit 可以存 32个数字,每一个bit位可以代表一个数字(即可以存储从0到31,共32个数字),这就是Bitmap在存储空间上的优势。

同理,如果Bitmap就只是存一个很大的数字10000, 那么怎么用Bitmap表示呢?那就在第10000个bit位上设置1,其它的bit位还是默认的0,那么Bitmap此时是占了10000bit的,而10000这个数字用一个int类型的数组存的话,内存中还是只占32bit,所以,在存储数据稀疏时,会有极大的浪费。

如何使用Bitmap排序?

如何使用Bitmap对(4,7,2,5,3)这五个元素进行排序?
(1). 因为是0-7之间的这8个数,所以我们只需要8个Bit的数组即可(1字节<1Byte>);
(2). 首先我们开辟1字节的空间,将这个位数组的所有Bit位都设为0;
(3). 遍历这5个元素。第一个元素是4,那么就把4对应的位设为1,因为索引是从零开始的,所以要把第五位设为1;第二个元素7,将第八位设为1;然后依次处理其他元素,将相应的位设为1;
(4). 以上处理完以后,我们再遍历这个Bit数据,将值为1的、数组的索引输出:即为(2,3,4,5,7),这样就达到了排序的目的。

<think>我们正在讨论的是802.11协议中的部分虚拟位映射(Partial Virtual Bitmap)概念。根据引用[1]和[2],我们可以这样定义: ### 部分虚拟位映射(Partial Virtual Bitmap)的定义 部分虚拟位映射是802.11信标帧(Beacon Frame)中**流量指示图(TIM)**的一种压缩表示形式,用于高效指示接入点(AP)缓存了多少个待传输的单播帧给处于节能模式的客户端(STA)。其核心设计原理如下: 1. **逻辑结构基础** 整个TIM本质上是一个长度为 **2008位** 的虚拟位映射(Virtual Bitmap)[^2]。 每个位(bit)对应一个**关联标识符(Association ID, AID)**,其中: - **AID范围**:从1到2007(AID=0保留给广播/组播)[^1][^2] - **位状态**: - `1`:表示AP缓存了该AID对应的待传数据 - `0`:表示无缓存数据 > 📌 示例:若AID=5对应的位为1,则说明AP缓存了给关联ID为5的STA的单播数据。 2. **压缩机制的必要性** 由于完整传输2008位(251字节)的位映射会极大增加信标帧长度,802.11采用**分段传输策略**: - AP仅传输**最近发生变化的位片段**(即Partial Virtual Bitmap) - 接收端(STA)通过组合多个信标帧中的Partial Virtual Bitmap重构完整位图 3. **关键字段解析** 在信标帧的TIM信息元素(Information Element)中,Partial Virtual Bitmap通过以下字段实现: - **Bitmap Control字段(1字节)**: - **Bit 0 (最低位)**:指示AID=0的组播/广播缓存状态(1=有缓存,0=无缓存) - **Bit 1-7**:表示**位图偏移量(Bitmap Offset)**,定义当前Partial Virtual Bitmap在完整2008位图中的起始位置(以8字节为块单位) - **Partial Virtual Bitmap字段(变长)**: - 长度可变(通常为1-251字节),每1字节代表连续8个AID的状态 - 实际传输的位片段范围由Bitmap Offset决定 > 💡 计算示例:若Bitmap Offset=3,则Partial Virtual Bitmap覆盖的AID范围为 $3 \times 8 \times 8 = 192$ 到 $192 + \text{Partial Virtual Bitmap长度} \times 8 - 1$。 4. **STA的节能监听流程** 1. STA定期醒来监听信标帧 2. 解析Bitmap Offset和Partial Virtual Bitmap,更新本地的完整位图副本 3. 检查自身AID对应的位: - 若为1 → 发送PS-Poll帧请求数据传输 - 若为0 → 继续休眠 ### 结构示意图 ```plaintext | TIM Information Element | |-----------------------------------------| | Element ID | Length | DTIM | Bitmap Ctrl| Partial Virtual Bitmap ... | | (1 byte) |(1 byte)|(1B) | (1 byte) | (N bytes) | ``` - **Bitmap Control字段分解**: ``` 7 6 5 4 3 2 1 0 ← Bit位索引 +---------------+---------------+ | Bitmap Offset | Multicast Flag| +---------------+---------------+ ``` ### 总结定义 > **部分虚拟位映射(Partial Virtual Bitmap)** 是802.11协议中为优化TIM传输效率设计的压缩数据结构。它通过仅传输虚拟位映射中发生变化的连续片段(由Bitmap Offset定位),减少信标帧负载,同时使STA能准确获知AP缓存的单播数据状态[^1][^2]。 §§相关问题§§ 1. 如何解析Wireshark捕获的Beacon帧中的Partial Virtual Bitmap字段? 2. STA如何根据Bitmap Offset计算自身AID在Partial Virtual Bitmap中的位置? 3. TIM与DTIM在信标帧中的作用有何区别? 4. 为什么AID=0要单独用Bitmap Control的最低比特位表示? </think> ### 部分虚拟位映射(Partial Virtual Bitmap)定义解析 部分虚拟位映射是802.11无线网络协议中**流量指示图(TIM)**的核心组成部分,用于高效通知休眠状态的客户端设备(STA)是否有待接收的数据帧。其核心定义和机制如下: #### 1. 基础结构 - **完整虚拟位映射**: 由**2008个连续比特位**组成的逻辑结构,每个比特位对应一个关联标识符(AID) - AID范围:1~2007(AID=0保留给广播/组播) - 比特状态: `1` = 该AID对应设备有待传数据 `0`= 无待传数据 #### 2. 部分虚拟位映射的作用 为解决完整传输2008位效率低下的问题,设计为**选择性传输**: - 仅传输**最近状态发生变化的比特片段** - 通过两个关键字段实现: - **Bitmap Control(位映射控制)** - Bit 0:指示AID=0的组播/广播待传状态(1=有待传组播数据) - Bit 1-7:**位映射偏移量(Bitmap Offset)**,标识传输片段的起始位置 - **Partial Virtual Bitmap(部分虚拟位映射)** 变长字段(1-251字节),携带实际的状态比特片段 #### 3. 工作流程 1. **AP侧**: - 维护完整的2008位虚拟位映射 - 在信标帧中仅打包发送**包含变化的比特片段** - 通过Bitmap Offset指定片段位置(偏移量单位:8字节块) 2. **STA侧**: - 定期唤醒监听信标帧 - 根据Bitmap Offset定位自身AID对应的比特位 - 若比特=1,则发送PS-Poll帧请求数据 #### 4. 技术优势 - **高效节能**:休眠STA只需检查少量比特位 - **带宽优化**:减少信标帧负载(平均仅需传输1-8字节) - **动态更新**:通过偏移量机制支持局部更新 > 📌 **示例**: > 若Bitmap Offset=3(二进制`0000011`),表示传输的片段从完整位图的第$3×8×8=192$位开始。STA根据自身AID计算在该片段中的位置,只需检查少量比特即可判断待传状态[^2]。 ### 典型应用场景 当AP缓存了给多个STA的数据时: 1. 组播数据:通过Bitmap Control的Bit 0指示 2. 单播数据:通过Partial Virtual Bitmap中对应AID的比特位指示 3. 节能STA:仅需检查自身AID对应的比特位,无需处理整个位图
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

cloneme01

谢谢您的支持与鼓励!

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

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

打赏作者

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

抵扣说明:

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

余额充值