我们想使用hash映射,将对应的正整数映射到位图集合中。即将正整数映射到bit集合中,每一个bit代表其映射的正整数是否存在。
比如{1,2,3,5,8,13}使用下列集合表示:具体实现如下:
#include <stdio.h> #include <stdlib.h> #define MASK 0x0001 #define NUMBER 10000 //读取的整数个数 #define ARRAY_LEN (NUMBER/32+1) //本测试机 int 为 32位 int b[ARRAY_LEN]; int main() { int n, m, i, k; int temp; FILE *fp; fp = fopen("text.txt","r"); if(!fp) { printf("open error!"); exit(1); } while (fscanf(fp, "%d", &temp) == 1)//读取数据,存在的数据 将对应的bit位置1,例如 11 存在则 bit[11] = 1 { n = temp / 32; m = temp % 32; b[n] = b[n] | (MASK<<m);// printf("n = %d, m = %d, b[%d] = %x\n", n, m , n, b[n]); } fclose(fp); for (i = 0; i < ARRAY_LEN; i++)//进行输出 { for(k = 0; k < 32; k++) { if (b[i] & (MASK<<k)) { printf("%d ",i*32+k); } } } return 0; }
另可以做封装函数
void set(int i) { b[i>>SHIFT] |= (1<<(i&0x1f)); } void clr(int i) { b[i>>SHIFT] &= ~(1<<(i&0x1f)); } int test(int i) { return b[i>>SHIFT] & (1<<(i&0x1f)); }
test.txt 中数据格式 :324 334 12 23 45 55....