<pre name="code" class="cpp">/************************************************************************* > File Name: bmp.h > Author: zhoulin > Mail: [email protected] > Created Time: Wed 11 May 2016 08:17:34 PM CST ************************************************************************/ #ifndef _BMP_H #define _BMP_H #define mword 32 #define shift 5 #define mask 0x1F //创建一个整形数组,用于存放标记,每个一个需要排序或者查找的元素对应taget数组中一个位 int *createTarget(int vmax); //vmax是数组中最大的那个值,用于申请标记数组的内存 //设置n在target中的位置,如果存在位1 void setBit(int n,int *target);//设置数组的标记位 void clsBit(int n,int *target); int flgBit(int n,int *target);//设置顺序判断数组中的元素是否在数组中存在 void destroyTarget(int *target);//资源释放 int isExists(int v,int *target);//判断某个元素是否在数组中 #endif
/************************************************************************* > File Name: bmp.c > Author: zhoulin > Mail: [email protected] > Created Time: Wed 11 May 2016 08:20:21 PM CST ************************************************************************/ #include "bmp.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> int *createTarget(int vmax) { int alloc_len = 0; short mod = vmax%mword; if(mod == 0){ alloc_len = vmax/mword; }else{ alloc_len = vmax/mword + 1; } fprintf(stdout,"-----max =%d,alloc size= %d k---------\n",vmax,alloc_len*sizeof(int)/1024); int *ptr = (int *)malloc(sizeof(int)*alloc_len); if(ptr == NULL) return NULL; memset(ptr,0,sizeof(int)*alloc_len); return ptr; } void destroyTarget(int *target) { if(target != NULL){ free(target); target = NULL; } } void setBit(int n,int *target) { int k = (n>>shift); target[k] |= (1<<(n&mask)); } void clsBit(int n,int *target) { int k = (n>>shift); target[k] &= (~(1<<(n&mask))); } int flgBit(int n,int *target) { int k = (n>>shift); return (target[k] & (1<<(n&mask))); } int isExists(int v,int *target) { int f = flgBit(v,target); return f>0?1:0; } int main(void) { int len = 1024*1024; int arr[len]; int i; int count = 0; for(i = 0;i < len;i++) { arr[i] = rand()%1023+1; //fprintf(stdout,"arr[%d] = %d\n",i,arr[i]); } int *tar = createTarget(len); for(i = 0;i < len;i++) { clsBit(i,tar); } for(i = 0;i < len;i++){ setBit(arr[i],tar); } for(i = 0;i < 1024;i++){ int f = flgBit(i,tar); if(f != 0) { count++; //fprintf(stdout,"data =%d\n",i); } } fprintf(stdout,"isExists(%d) =%d\n",99999,isExists(99999,tar)); fprintf(stdout,"isExists(%d) =%d\n",arr[3],isExists(arr[3],tar)); destroyTarget(tar); return 0; }