一、原理

   (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;          }