bitop.h
上传用户:poi891205
上传日期:2013-07-15
资源大小:9745k
文件大小:1k
源码类别:

DVD

开发平台:

C/C++

  1. #ifndef __BITOP_H
  2. #define __BITOP_H
  3. // revn(): reverse #n LSB bit order
  4. unsigned revn(unsigned u, int n);
  5. //
  6. // getbits utility for gunzip
  7. // *note* this getbits utility is:
  8. // 1. byte-oriented
  9. // 2. LSB first
  10. //
  11. // t_getbit
  12. typedef struct {
  13.     BYTE *p;
  14.     int   r;
  15. } t_getbit;
  16. // showbits()
  17. unsigned showbit(t_getbit *p);
  18. // dumpbits()
  19. #define dumpbits(p,n) (((p)->r)+=(n))
  20. // getbits_bytealign()
  21. static inline
  22. void
  23. getbits_bytealign(t_getbit *p)
  24. {
  25.     p->r=(p->r+7) & ~7;
  26. }
  27. // maskbit()
  28. static inline
  29. unsigned
  30. maskbit(unsigned b, unsigned n)
  31. {
  32.     UINT32 mask = (n==32) ? 0xffffffffu : (1u<<n)-1;
  33.     return b & mask;
  34. }
  35. // getbits()
  36. static inline unsigned
  37. getbits(t_getbit *p, int n)
  38. {
  39.     unsigned v = maskbit(showbit(p),n);
  40.     dumpbits(p,n);
  41.     return v;
  42. }
  43. // getbits_init()
  44. static inline void
  45. getbits_init(t_getbit *p, const void *ptr)
  46. {
  47.     p->p=(BYTE *)ptr; // initialize input pointer
  48.     p->r=0; // initialize input bit-pointer
  49. }
  50. //
  51. // gunzip()
  52. // return <0 value for failure within gunzip process
  53. // you need to initialize getbits structure before this.
  54. //
  55. int gunzip(t_getbit *gb, BYTE *op);
  56. #endif/*BITOP_H*/