其实c++里有bitset这个类,但是bitset使用时必须给定大小。例如
bitset<8> c;//这里必须在编码里写死,不能使用变量替代
c = 234;
我主要是用这个东西来存储可变长的huffman编码。所以这个类对我根本不能用。除非开始就给一个足够大的bitset。
所以我创建里一个可变长的bit vector用于存放Huffman编码。
在这里内部使用的是__int64,64位。当然根据实际需要可以将这个做为模板传入,不过现在还没有这样编码。
- /*createdbychicochen
- *date2008/10/25
- */
- #ifndef_BIT_VECTOR_
- #define_BIT_VECTOR_
- #include<iostream>
- usingnamespacestd;
- classBITVector
- {
- private:
- __int64*bitarray;
- constintbits;
- constunsigned__int64mask;
- intsize;
- voidSetOne(intindex);//xis0
- voidSetZero(intindex);//xis1
- voidLarger();
- public:
- BITVector(void);
- voidSet(intindex,intx);//xis0or1
- intGet(intindex);
- intSize();
- voidSetInt(unsignedintinteger,intstart,intlen);
- voidPrintfZeroOne(intstart,intlen);//printtheunsigneditas0or1
- voidSetBitVector(BITVector&c,intstart,intlen);
- constBITVector&operator=(constBITVector&bitVector);
- explicitBITVector(constBITVector&bitVector);
- public:
- ~BITVector(void);
- };
- #endif
然后是bitVector.cpp文件
- /*createdbychicochen
- *date2008/10/25
- */
- #include"StdAfx.h"
- #include"BITVector.h"
- BITVector::BITVector(void):mask(0x8000000000000000),bits(sizeof(__int64)*8)
- {
- bitarray=new__int64[1];
- memset(bitarray,0,sizeof(__int64));
- size=1;
- }
- BITVector::~BITVector(void)
- {
- size=0;
- delete[]bitarray;
- }
- voidBITVector::Set(intindex,intx)
- {
- if(x==0)
- {
- returnSetZero(index);
- }
- else
- {
- returnSetOne(index);
- }
- }
- voidBITVector::SetZero(intindex)
- {
- intinnIndex=index/bits;
- intbitPos=index&(bits-1);//innIndex%8
- if(innIndex<size)
- {
- //vectormaybehasenoughspacetostorethis.
- this->bitarray[innIndex]=this->bitarray[innIndex]&~(mask>>bitPos);
- }
- elseif(innIndex==size)
- {
- //shouldlargerthesizeofbitarray
- //andinnIndexmustbethefirstbitoflastchar
- if(bitPos==0)
- {
- //correct
- this->Larger();
- this->bitarray[innIndex]=this->bitarray[innIndex]&~(mask>>bitPos);
- }
- else
- {
- //error
- }
- }
- else
- {
- //theremaybesomethingerror,orsomecodemissing
- }
- }
- voidBITVector::Larger()
- {
- __int64*tempArray=new__int64[size];
- memcpy(tempArray,this->bitarray,sizeof(__int64)*size);
- delete[]this->bitarray;
- this->bitarray=new__int64[size*2];//maybeerror
- memset(bitarray,0,sizeof(__int64)*size*2);
- memcpy(this->bitarray,tempArray,sizeof(__int64)*size);
- size=size*2;
- delete[]tempArray;
- }
- voidBITVector::SetOne(intindex)
- {
- intinnIndex=index/bits;//youcanuse>>(bits-1)
- intbitPos=index%bits;//innIndex&(bits-1)
- if(innIndex<size)
- {
- //vectormaybehasenoughspacetostorethis.
- this->bitarray[innIndex]=this->bitarray[innIndex]|(mask>>bitPos);
- }
- elseif(innIndex==size)
- {
- //shouldlargerthesizeofbitarray
- //andinnIndexmustbethefirstbitoflastchar
- if(bitPos==0)
- {
- //correct
- this->Larger();
- this->bitarray[innIndex]=this->bitarray[innIndex]|(mask>>bitPos);
- }
- else
- {
- //error
- }
- }
- else
- {
- //theremaybesomethingerror,orsomecodemissing
- }
- }
- intBITVector::Get(intindex)
- {
- if(index<size*bits)
- {
- intposition=index&(bits-1);//%bits
- intinnIndex=index/bits;
- __int64i=this->bitarray[innIndex]&(mask>>position);
- if(i==0)
- {
- return0;
- }
- else
- {
- return1;
- }
- }
- throw"accessoutofthearray";
- }
- intBITVector::Size()
- {
- returnsize*bits;
- }
- //intintegeris0x01010111
- //startisthestartpositionofbitvector,andstartstartszero
- //lenislengthofthenumberofbitsyouwantsetintobitarray
- voidBITVector::SetInt(unsignedintinteger,intstart,intlen)
- {
- intfinalPos=start+len;
- inti=start;
- intj=0;
- inttemp=0;
- for(;i<finalPos;i++,j++)
- {
- temp=integer&(0x80000000>>j);
- this->Set(i,temp);
- }
- }
- voidBITVector::PrintfZeroOne(intstart,intlen)
- {
- intfinalPos=start+len;
- inttemp=0;
- for(inti=start;i<finalPos;i++)
- {
- printf("%d",this->Get(i));
- }
- }
- //startiswheretoinsertbitvectorc
- //lenisthelengthofbitsinserted
- //"start"isofthis,and"len"isofc;
- voidBITVector::SetBitVector(BITVector&c,intstart,intlen)
- {
- for(inti=0;i<len;i++)
- {
- this->Set(start+i,c.Get(i));
- }
- }
- //copyconstruct
- BITVector::BITVector(constBITVector&bitVector):mask(0x8000000000000000),bits(sizeof(__int64)*8)
- {
- this->size=bitVector.size;
- this->bitarray=new__int64[this->size];
- memcpy(this->bitarray,bitVector.bitarray,sizeof(__int64)*bitVector.size);
- }
- constBITVector&BITVector::operator=(constBITVector&bitVector)
- {
- if(this!=&bitVector)
- {
- this->size=bitVector.size;
- delete[]this->bitarray;
- this->bitarray=new__int64[this->size];
- memcpy(this->bitarray,bitVector.bitarray,sizeof(__int64)*this->size);
- }
- return*this;
- }