I 位向量的实现与应用

位向量,又称位图,是一种高效的数据结构,常用于处理海量数据。文章介绍了位向量的基本概念,通过`int`数组实现位向量,并详细解析了位向量的SET和CLR宏函数。接着,文章展示了位向量在《编程珠玑》中解决海量数据排序问题的应用,以及Linux中PID分配算法中的运用,深入理解位向量在实际场景中的价值。
摘要由CSDN通过智能技术生成

这篇文章是《读厚<编程珠玑>》系列博客的第一篇,我们在《编程珠玑》的第一章 - 开篇中就了解了位向量是什么,《编程珠玑》的作者使用位向量来解决了一个海量数据排序问题,这篇文章我们来深入的了解一下位向量的实现与应用。

0x00 位向量是什么?

位向量,也叫位图,是一个我们经常可以用到的数据结构,在使用小空间来处理大量数据方面有着得天独厚的优势。位向量,顾名思义就是「位构成的向量」,我们通常使用0来表示 false,1来表示 true,例:[010111] 我们就可以说它是一个位向量,它表示 [false true false true true true]。在位向量这个数据结构中,我们常常把它的索引和它的值对应起来使用

0x01 位向量的实现

通常我们实现位向量的思路是:使用基本数据类型来表示多个位,使用多个基本数据类型来构成数组。例如:我们使用「int」类型来实现位向量,一个「int」类型有32位,我们使用 int 数组来存放整个位向量。

下面根据这个思路我们来写一下代码:

#ifndef bitvector_h
#define bitvector_h

#include <stdio.h>

#define N 1000000       //表示位向量元素个数
#define BITPERINT 32    //int 有32位
#define NUM (N-1)/BITPERINT+1
#define SHIFT 5     //2^5=32,表示移位
#define MASK 0x1F   //二进制11111
#define SET(i){vector[i >> SHIFT] |= (1 << (i & MASK));}    //第i位 置为1
#define CLR(i){vector[i >> SHIFT] &= ~(1 << (i & MASK));}   //第i位 置为0

#endif /* bitvector_h */

下面我们来分析一下这段代码,关键的部分就是 SET 和 CLR 这两个宏函数,我们来分解看一下代码:

i >> SHIFT表示算数右移5位,即i / 32,该操作的作用是将数组的索引定位到需要操作的那个 int 的位置上,因为我们的位向量结构是由许多个 int 组成的,例如:如果i = 50,i >> SHIFT等于1,首先将第50位定位到了第2个 int 中。

i & MASK表示取 i 的最后5位,例:50 & MASK 等于10010,然后把1左移这么多位,即第18位为1

SET操作是取或运算,即把定位到的 int 中的某位设置为1,例:i = 50即把第二个 int 的第18位置1。CLR操作也是同样的道理。

使用位向量:

int vector[NUM];
int i;
for(i = 0; i < N; i++)
{
    CLR(i);
}
SET(1);
SET(20);

0x02 位向量的应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值