<pre name="code" class="cpp">/*************************************************************************
> File Name: bmp.h
> Author: zhoulin
> Mail: 715169549@qq.com
> 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: 715169549@qq.com
> 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;
}