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