位数据结构实现

   1: #include <stdio.h>
   2:  
   3: #define N 10000000
   4: #define BITSPERWORD 32
   5: #define SHIFT 5
   6: #define MASK 0x1F
   7:  
   8: int arr[1+N/BITSPERWORD];
   9: /*
  10: 整个程序的思想就是:
  11:   1.每个整数有32位,那么它就可以表示32个数,分别对应每bit位为1.
  12:   2.然后把10000000个数分为1+N/BITSPERWORD组(相当于有这么多个桶),每组包含接近32个数。
  13:   上面的解释可能仍不到位,那我们来看具体的函数:
  14:   对于set函数,我们可以这样理解,
  15:   arr[i>>SHIFT] |= (1<<(i&MASK))可以转化为
  16:   arr[i/32] = arr[i/32] | (1<<(i%32))
  17:   i%32必然处于区间[0, 31],那么1<<(i%32)就是将bit位1向前移动(i%32)位,然后和arr[i/32]相或,因而arr[i/32]的第(i%32)位就为1.
  18:   对于test函数,就是上面过程的反过程了。它是用来判断i个这个数是否存在,即arr[i/32]的相应bit位是否为1.
  19:   最后,就做排序了,
  20:   for (int i = 0; i < N; i++)
  21:   由于[0, N)已经是从小到大排序好的,那么我们只需判断每个数是否存在,若存在,就输出,所以输出结果也就是排序的了。
  22: 
  23: */
  24:  
  25: void setbit(int i)
  26: {
  27:     arr[i>>SHIFT] |= 1 << (i&MASK);
  28: }
  29: void clearbit(int i)
  30: {
  31:     arr[i>>SHIFT] &= ~(1<<(i&MASK));
  32: }
  33:  
  34: int testbit(int i)
  35: {
  36:     arr[i>>SHIFT] & (1<<(i&MASK));
  37: }
posted @ 2012-10-14 23:13  foreverlearn  阅读(275)  评论(0编辑  收藏  举报