位数据结构实现

   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: }

转载于:https://www.cnblogs.com/foreverlearn/archive/2012/10/14/2723537.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值