Guest User

bit_utils.cpp

a guest
Oct 26th, 2018
197
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.76 KB | None | 0 0
  1. #include "bit_utils.h"
  2.  
  3. /* return the byte in position n */
  4. template <class byte_iterator>
  5. byte get_byte(byte_iterator begin, int n)
  6. {
  7.     if(n%8==0)
  8.     {
  9.         return begin[n/8] ;
  10.     }
  11.     return (begin[n/8] << (n%8) ) | (begin[n/8 + 1]>>(8-n%8));
  12. };
  13.  
  14.  
  15. /* return n bit starting from the bit in start */
  16. template<class byte_iterator>
  17. bits get_bits(byte_iterator begin, int start, int n)
  18. {
  19.     bits a;
  20.     a.size=n;
  21.     int full_b=n/8, rem=n%8;
  22.     for(int i=0; i<full_b; ++i)
  23.     {
  24.         a.b.push_back(get_byte(begin, start + i*8));       
  25.     }
  26.     if(rem)
  27.     {
  28.         if(start%8+rem>7)
  29.         {
  30.             a.b.push_back(get_byte(begin, start+n-rem));
  31.         }
  32.         else
  33.         {
  34.             a.b.push_back(begin[start/8+full_b]<<(start%8));
  35.         }
  36.     }
  37.     return a;
  38. };
  39.  
  40.  
  41. /* insert n bits in begin at start*/
  42. template<class byte_iterator>
  43. void bits_insert(const bits& b, byte_iterator begin, int start, int n)
  44. {
  45.     int prefix=(8-start%8)%8;
  46.     if(n<prefix)
  47.     {
  48.         byte pre=(begin[start/8]>>(prefix))<<(prefix);
  49.         byte post=( (byte)(begin[start/8]<<(8-prefix+n)) )>>(8-prefix+n);
  50.         begin[start/8]=pre | ((b.b[0]>>(8-n))<<(prefix-n)) | post;
  51.         return;
  52.     }
  53.     int first_byte=start/8;
  54.     if (prefix!=0)
  55.     {
  56.         byte pre=(begin[first_byte]>>(prefix))<<(prefix);
  57.         begin[first_byte]= pre | (b.b[0]>>(8-prefix));
  58.         ++first_byte;
  59.     }
  60.     int center=(n-prefix)/8;
  61.     for (int i=0; i<center; ++i)
  62.     {
  63.         begin[first_byte+i]=get_byte(b.b.begin(), prefix+8*i);
  64.     }
  65.     int post=(n-prefix)%8;
  66.     if (post!=0)
  67.     {
  68.         byte temp=get_byte(b.b.begin(), n-8);
  69.         byte pre=temp<<(8-post);
  70.         begin[(start+n)/8]=pre | ((byte)(begin[(start+n)/8]<<post)>>post);
  71.     }  
  72. };
  73.  
  74.  
  75. /* return number of bits matching in the two bytes, supposed different */
  76. int bit_compare(byte a, byte b)
  77. {
  78.     int h;
  79.     for (h=1; h<8; ++h)
  80.     {
  81.         if ( (a>>h)==(b>>h) )
  82.             return 8-h;
  83.     }
  84.     return 0;
  85. };
Advertisement
Add Comment
Please, Sign In to add comment