首页 > 技术文章 > 位图的应用

uangyy 2016-10-08 17:39 原文

#include <stdio.h>
#include <inttypes.h>


//一共16位的位图,期中前八位是0,后八位是1
static const uint8_t normal[2] = { 
    0 | 0 | 0 | 0 | 0 | 0 | 0 | 0,
    1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
};

#define BIT_AT(a, i)\
    ((unsigned int) (a)[(unsigned int) (i) >> 3] & \    //计算出i属于第几组
    (1 << ((unsigned int) (i) & 7)))              //计算出i属于第几位

int main(int argc, char **argv)
{

    int i = 0;
    for (i = 0; i < 16; ++i)
    {   
        printf("%d\n", BIT_AT(normal, i));
    }   
    return 0;
}
结果:
0
0
0
0
0
0
0
0
1
2
4
8
16
32
64
128

应用:通过一个16 * 8的位图可以完整的表明128位的字符合法状况(合法为1,非法为0), 通过该方法可以很快的获得一个字符是否合法(如:是否是合法的url字符)

#include <inttypes.h>
#define T(v) 0

//判断a的第i为是否合法
#ifndef BIT_AT
#define BIT_AT(a, i)                                                \
  (!!((unsigned int) (a)[(unsigned int) (i) >> 3] &                  \
   (1 << ((unsigned int) (i) & 7))))
#endif

//合法的url字符数组,一共128bit;其中合法为1,非法为0
static const uint8_t normal_url_char[32] = {
/*   0 nul    1 soh    2 stx    3 etx    4 eot    5 enq    6 ack    7 bel  */
        0    |   0    |   0    |   0    |   0    |   0    |   0    |   0,
/*   8 bs     9 ht    10 nl    11 vt    12 np    13 cr    14 so    15 si   */
        0    | T(2)   |   0    |   0    | T(16)  |   0    |   0    |   0,
/*  16 dle   17 dc1   18 dc2   19 dc3   20 dc4   21 nak   22 syn   23 etb */
        0    |   0    |   0    |   0    |   0    |   0    |   0    |   0,
/*  24 can   25 em    26 sub   27 esc   28 fs    29 gs    30 rs    31 us  */
        0    |   0    |   0    |   0    |   0    |   0    |   0    |   0,
/*  32 sp    33  !    34  "    35  #    36  $    37  %    38  &    39  '  */
        0    |   2    |   4    |   0    |   16   |   32   |   64   |  128,
/*  40  (    41  )    42  *    43  +    44  ,    45  -    46  .    47  /  */
        1    |   2    |   4    |   8    |   16   |   32   |   64   |  128,
/*  48  0    49  1    50  2    51  3    52  4    53  5    54  6    55  7  */
        1    |   2    |   4    |   8    |   16   |   32   |   64   |  128,
/*  56  8    57  9    58  :    59  ;    60  <    61  =    62  >    63  ?  */
        1    |   2    |   4    |   8    |   16   |   32   |   64   |   0,
/*  64  @    65  A    66  B    67  C    68  D    69  E    70  F    71  G  */
        1    |   2    |   4    |   8    |   16   |   32   |   64   |  128,
/*  72  H    73  I    74  J    75  K    76  L    77  M    78  N    79  O  */
        1    |   2    |   4    |   8    |   16   |   32   |   64   |  128,
/*  80  P    81  Q    82  R    83  S    84  T    85  U    86  V    87  W  */
        1    |   2    |   4    |   8    |   16   |   32   |   64   |  128,
/*  88  X    89  Y    90  Z    91  [    92  \    93  ]    94  ^    95  _  */
        1    |   2    |   4    |   8    |   16   |   32   |   64   |  128,
/*  96  `    97  a    98  b    99  c   100  d   101  e   102  f   103  g  */
        1    |   2    |   4    |   8    |   16   |   32   |   64   |  128,
/* 104  h   105  i   106  j   107  k   108  l   109  m   110  n   111  o  */
        1    |   2    |   4    |   8    |   16   |   32   |   64   |  128,
/* 112  p   113  q   114  r   115  s   116  t   117  u   118  v   119  w  */
        1    |   2    |   4    |   8    |   16   |   32   |   64   |  128,
/* 120  x   121  y   122  z   123  {   124  |   125  }   126  ~   127 del */
        1    |   2    |   4    |   8    |   16   |   32   |   64   |   0, };

#define IS_URL_CHAR(c)      (BIT_AT(normal_url_char, (unsigned char)c))

#include <stdio.h>

int main(int argc, char **argv)
{
    int i = 0;
    for (i = 0; i < 127; ++i)
    {
        if (IS_URL_CHAR(i))
            printf("%c, %d\n", i, i);
    }
    return 0;
}

 

推荐阅读