一、原理

   (1)

    一个字节Byte共8个bit位,使用每一位表示为一个元素。

    即:这个元素存在,则对应的bit位是1,否则为0

    例:

    二进制表示的一个字节      10010010

     实际的元素                     7    4    1

    本例子中使用int,4个字节共32位, int bitmap[N]

        bitmap[0]      0   ~ 31

        bitmap[1]      32 ~ 63

        bitmap[2]      64 ~ 95

        ......

        bitmap[N]      32N ~ 32(N+1) - 1

    

    (2)

        求num所在数组的下标

            num / 32 ,使用移位操作更快捷,即 num >> 5

        求num在一个int中的那个对应位

            num % 32, 使用位操作,即 num & 0x1f


二、优缺点

        缺点:        

            (1)表现的

            (2)不能操作有重复的元素

        优点:

            (1)压缩存储,节省空间

            (2)操作简单,时间复杂的为O(1)

                用于大数据量并且没有重复的数据的排序,无需比较


三、代码实现

      #define MOD   0x1f  
      #define SHR   5     
      
      #define N 100 //这个根据实际情况写,也可以根据输入确定
      
      int bitmap[N >> 5 + 1];
      
      void set_bit(int bitmap[], int num)  
      {   
            bitmap[num >> SHR] |= (1 << (num & MOD));   
      }       
      
      void clear_bit(int bitmap[], int num) 
      {      
            bitmap[num >> SHR] &= ~(1 << (num & MOD));   
      }      
      
      void clear2_bit(int bitmap[], int num)   
      {       
            bitmap[num >> SHR] ^= (bitmap[num >> SHR] & (1 << (num & MOD)));
      }
      
      int find_bit(int bitmap[], int num)
      {
              return (bitmap[num >> SHR] & (1 << (num & MOD))) != 0;    
      }