编程练习——可变长bit数组(bitArray)

 其实c++里有bitset这个类,但是bitset使用时必须给定大小。例如

bitset<8> c;//这里必须在编码里写死,不能使用变量替代

c = 234;

我主要是用这个东西来存储可变长的huffman编码。所以这个类对我根本不能用。除非开始就给一个足够大的bitset。

所以我创建里一个可变长的bit vector用于存放Huffman编码。

在这里内部使用的是__int64,64位。当然根据实际需要可以将这个做为模板传入,不过现在还没有这样编码。

 

 

  1. /* created by chico chen
  2. *  date 2008/10/25
  3. */
  4. #ifndef _BIT_VECTOR_
  5. #define _BIT_VECTOR_
  6. #include <iostream>
  7. using namespace std;
  8. class BITVector
  9. {
  10. private:
  11.     __int64 * bitarray;
  12.     const int bits;
  13.     const unsigned __int64 mask ;
  14.     int size;
  15.     void SetOne(int index);// x is 0 
  16.     void SetZero(int index);// x is 1
  17.     void Larger();
  18.     
  19. public:
  20.     BITVector(void);
  21.     void Set(int index, int x); // x is 0 or 1
  22.     int Get(int index);
  23.     int Size();
  24.     void SetInt(unsigned int integer,int start,int len);
  25.     void PrintfZeroOne(int start , int len);// print the unsigned it as 0 or 1
  26.     void SetBitVector(BITVector & c, int start, int len);
  27.     const BITVector& operator=(const BITVector& bitVector);
  28.     explicit BITVector(const BITVector & bitVector);
  29. public:
  30.     ~BITVector(void);
  31. };
  32. #endif

然后是bitVector.cpp文件

 

 

  1. /* created by chico chen
  2. *  date 2008/10/25
  3. */
  4. #include "StdAfx.h"
  5. #include "BITVector.h"
  6. BITVector::BITVector(void):mask(0x8000000000000000),bits(sizeof(__int64)*8)
  7. {
  8.     bitarray = new __int64[1];
  9.     memset(bitarray,0,sizeof(__int64));
  10.     size = 1;
  11. }
  12. BITVector::~BITVector(void)
  13. {
  14.     size = 0;
  15.     delete[] bitarray;
  16. }
  17. void BITVector::Set(int index, int x)
  18. {
  19.     if(x == 0)
  20.     {
  21.         return SetZero(index);
  22.     }
  23.     else
  24.     {
  25.         return SetOne(index);
  26.     }
  27. }
  28. void BITVector::SetZero(int index)
  29. {
  30.     int innIndex = index/bits;
  31.     int bitPos = index & (bits-1); // innIndex % 8
  32.     if( innIndex < size)
  33.     {
  34.         // vector maybe has enough space to store this .
  35.         this->bitarray[innIndex] = this->bitarray[innIndex] & ~(mask >> bitPos);
  36.     }
  37.     else if(innIndex == size)
  38.     {
  39.         // should larger the size of bitarray
  40.         // and innIndex must be the first bit of last char 
  41.         
  42.         if(bitPos == 0)
  43.         {
  44.             // correct
  45.             this->Larger();
  46.             this->bitarray[innIndex] = this->bitarray[innIndex] & ~(mask >> bitPos);
  47.         
  48.         }
  49.         else
  50.         {
  51.             // error
  52.             
  53.         }
  54.     }
  55.     else
  56.     {
  57.         // there may be something error, or some code missing
  58.         
  59.     }
  60. }
  61. void BITVector::Larger()
  62. {
  63.     __int64 * tempArray = new __int64[size];
  64.     memcpy(tempArray,this->bitarray,sizeof(__int64)*size);
  65.     delete[] this->bitarray;
  66.     
  67.     this->bitarray = new __int64[size*2]; // may be error
  68.     memset(bitarray,0,sizeof(__int64)*size*2);
  69.     memcpy(this->bitarray,tempArray,sizeof(__int64)*size);
  70.     size = size*2;
  71.     delete[] tempArray;
  72.     
  73. }
  74. void BITVector::SetOne(int index)
  75. {
  76.     int innIndex = index/bits; // you can use >>(bits-1)
  77.     int bitPos = index % bits; // innIndex & (bits-1)
  78.     if( innIndex < size)
  79.     {
  80.         // vector maybe has enough space to store this .
  81.         this->bitarray[innIndex] = this->bitarray[innIndex] | (mask >> bitPos);
  82.     }
  83.     else if(innIndex == size)
  84.     {
  85.         // should larger the size of bitarray
  86.         // and innIndex must be the first bit of last char 
  87.         
  88.         if(bitPos == 0)
  89.         {
  90.             // correct
  91.             this->Larger();
  92.             this->bitarray[innIndex] = this->bitarray[innIndex] | (mask >> bitPos);
  93.             
  94.         }
  95.         else
  96.         {
  97.             // error
  98.             
  99.         }
  100.     }
  101.     else
  102.     {
  103.         // there may be something error, or some code missing
  104.     }
  105. }
  106. int BITVector::Get(int index)
  107. {
  108.     if(index < size*bits)
  109.     {
  110.         int position = index & (bits-1); // % bits
  111.         int innIndex = index/bits;
  112.         __int64 i = this->bitarray[innIndex] & (mask >> position);
  113.         if(i == 0)
  114.         {
  115.             return 0;
  116.         }
  117.         else
  118.         {
  119.             return 1;
  120.         }
  121.     }
  122.     throw "access out of the array";
  123. }
  124. int BITVector::Size()
  125. {
  126.     return size*bits;
  127. }
  128. // int integer is 0x01010111
  129. // start is the start position of bitvector, and start starts zero
  130. // len is length of the number of bits you want set into bit array
  131. void BITVector::SetInt(unsigned int integer,int start, int len)
  132. {
  133.     int finalPos = start + len; 
  134.     int i=start;
  135.     int j = 0;
  136.     int temp = 0;
  137.     for(;i < finalPos; i++,j++)
  138.     {
  139.         temp = integer & (0x80000000 >> j);
  140.         this->Set(i,temp);
  141.     }
  142. }
  143. void BITVector::PrintfZeroOne(int start,int len)
  144. {
  145.     int finalPos = start+len;
  146.     int temp = 0;
  147.     for(int i = start; i < finalPos; i++)
  148.     {
  149.         printf("%d",this->Get(i));
  150.     }
  151. }
  152. // start is where to insert bit vector c
  153. // len is the length of bits inserted
  154. // "start" is of this, and "len" is of c; 
  155. void BITVector::SetBitVector(BITVector & c, int start, int len)
  156. {
  157.     for(int i = 0; i < len; i++)
  158.     {
  159.         this->Set(start+i,c.Get(i));
  160.     }
  161.             
  162. }
  163. // copy construct
  164. BITVector::BITVector(const BITVector & bitVector):mask(0x8000000000000000),bits(sizeof(__int64)*8)
  165. {
  166.     this->size = bitVector.size;
  167.     this->bitarray = new __int64[this->size];
  168.     memcpy(this->bitarray,bitVector.bitarray,sizeof(__int64)*bitVector.size);
  169. }
  170. const BITVector& BITVector::operator=(const BITVector& bitVector)
  171. {
  172.     if(this != &bitVector)
  173.     {
  174.         this->size = bitVector.size;
  175.         delete [] this->bitarray;
  176.         this->bitarray = new __int64[this->size];
  177.         memcpy(this->bitarray,bitVector.bitarray,sizeof(__int64)*this->size);
  178.     }
  179.     return * this;
  180. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值