位向量的解读(初始化、赋值、取值)

什么是位向量?

位向量:

一组0,1串

个人理解:为了更有效的利用存储空间,使用编程语言层面的基本数据类型来表示机器位的方法。


什么时候使用位向量呀?

应用背景:

假设我有一组均小于一千万的数(这组数个数很多,至少二百万个),要对这组数进行排序工作,并输出到文件中,要求尽可能减少存储空间,提高运行效率。

这时候我们应该怎么办呢?

最直接的方法是我们使用整数来存储每一个数,然后对这组数使用常规的排序算法,但是这样我们需要10^7 * 4 B (假设整数是32位)这么多存储空间。

解决方案思路:
使用一个机器位来表示一个数的存在与否,数的位置即表示数的值,排序过程就是对这组数遍历,然后对存在数的位置赋值的过程,最后从第一位到最后一位顺序输出对应的数即可。例如:一个数为 31,那么在位向量的第31位赋值为1,输出的时候遍历到31位时,位值为1输出31即可。此时我们的存储空间为10^7 /8 B,存储空间明显变小了.


位向量的实现

位向量的实现有很多种,在这里我们就使用整型数组来表示吧。例如上述背景,一个整数可以表示32个机器位,那么10^7个机器位我们需要(10^7-1) / 32 + 1个整数。

详情见代码:

#define N 10000000
#define SHIFT 5
#define MASK 0x1F
#define BITOFINT 32 //假设整型为32位

/*
**赋值函数:给位向量的对应位置赋值1
**参数:i是要赋值1的数的位置,a[]为位向量数组
**返回值:null
*/
void set(int i, int *a)
{
  a[i >> SHIFT] |= 1 << ((i & MASK));
}

/*
**擦除函数:将对应位置赋值为0
**参数:i是要赋值1的数的位置,a[]为位向量数组
**返回值:null
*/
void clr(int i, int *a)
{
  a[i >> SHIFT] &= ~(1 << (i & MASK));
}

/*
**测试函数:测试位向量的对应位置的值.
**参数:i是要测试的位置,a[]为位向量数组.
**返回值: 0 or 大于0的数.
*/
int test(int i, int *a)
{
  return a[i >> SHIFT] & (1 << (i&MASK));
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值