首页 > 代码库 > 位图的应用

位图的应用

#include <stdio.h>#include <inttypes.h>//一共16位的位图,期中前八位是0,后八位是1static 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;}
结果:000000001248163264128

应用:通过一个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,非法为0static 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;}

 

位图的应用