编程珠玑-第一章--位图篇
2012-05-08 23:36
232 查看
文章开篇提到了:位图结构,在很多情况下,很巧妙的解决了问题。
在c++中有bitset类,可以直接拿来用,比较方便。
但是在习题后面有这么一道题目:如何使用位逻辑运算实现位向量?
难点在于理解后面的函数上。经过研究,我是这么理解的。
显然这个SHIFT是用来在位模式和数组之间转换的。
现在假设不是位模式,而是就在数组的情况下,
a[i] |= 1;
就是设置数组的第i位的方法,那么在位模式下,我们将数组的位置i映射为a[i>>SHIFT],那么如何将i对应的位设置为1呢?因为数组的一个数为32位,我们就要把i映射到这32位中的某一位,
也就是高位数x决定了i在数组中哪个int,后面的y决定了它在int中的位模式。
对应的位1<<(i&MASK),其实这里的i&MASK就是mod32,留下的就是上图的Y.
这么看,好理解了一些。
在c++中有bitset类,可以直接拿来用,比较方便。
但是在习题后面有这么一道题目:如何使用位逻辑运算实现位向量?
#define BITSPERWORD 32 #define SHIFT 5 #define MASK 0x1f #define N 10000000 int a[1+N/BITSPERWORD]; //用这个数组表示N位 void set(int i) { a[i>>SHIFT] |= (1<<(i&MASK)); } void clr(int i) { a[i>>SHIFT] &= ~(1<<(i&MASK)); } int test(int i) { return a[i>>SHIFT] &(1<<(i&MASK)); }
难点在于理解后面的函数上。经过研究,我是这么理解的。
显然这个SHIFT是用来在位模式和数组之间转换的。
现在假设不是位模式,而是就在数组的情况下,
a[i] |= 1;
就是设置数组的第i位的方法,那么在位模式下,我们将数组的位置i映射为a[i>>SHIFT],那么如何将i对应的位设置为1呢?因为数组的一个数为32位,我们就要把i映射到这32位中的某一位,
也就是高位数x决定了i在数组中哪个int,后面的y决定了它在int中的位模式。
对应的位1<<(i&MASK),其实这里的i&MASK就是mod32,留下的就是上图的Y.
这么看,好理解了一些。
相关文章推荐
- 编程珠玑(2)第一章学习之位图排序
- 《编程珠玑》学习笔记——第一章 位图数据结构
- java实现位图排序算法《编程珠玑》第一章笔记
- 位图排序概要 编程珠玑(第一章)-----学习笔记
- 位图排序概要 编程珠玑(第一章)-----学习笔记
- 《编程珠玑》第一章-位图排序
- 《编程珠玑》第一章-位图排序
- [编程珠玑]-第一章:位图/位向量排序
- 编程珠玑第一章 习题2,习题9
- 《编程珠玑》中“位图排序”引发的一系列实验
- 《编程珠玑》第一章读书笔记
- 编程珠玑:第一章开篇课后题解答
- 编程珠玑 第一章第9题 空间换时间的数据结构问题
- 使用位图解决电话号码排序问题--编程珠玑学习笔记 第一章
- 《编程珠玑》——第一章习题
- 位图排序——编程珠玑
- 《编程珠玑》--第一章 开山
- 【编程珠玑(续)】第一章 性能监视工具
- 编程珠玑(一):前言 && 位图排序
- 编程珠玑(第一章(2):位图索引)