`
holoblog
  • 浏览: 1227723 次
博客专栏
E0fcf0b7-6756-3051-9a54-90b4324c9940
SQL Server 20...
浏览量:18929
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

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

c = 234;

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

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

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

  1. /*createdbychicochen
  2. *date2008/10/25
  3. */
  4. #ifndef_BIT_VECTOR_
  5. #define_BIT_VECTOR_
  6. #include<iostream>
  7. usingnamespacestd;
  8. classBITVector
  9. {
  10. private:
  11. __int64*bitarray;
  12. constintbits;
  13. constunsigned__int64mask;
  14. intsize;
  15. voidSetOne(intindex);//xis0
  16. voidSetZero(intindex);//xis1
  17. voidLarger();
  18. public:
  19. BITVector(void);
  20. voidSet(intindex,intx);//xis0or1
  21. intGet(intindex);
  22. intSize();
  23. voidSetInt(unsignedintinteger,intstart,intlen);
  24. voidPrintfZeroOne(intstart,intlen);//printtheunsigneditas0or1
  25. voidSetBitVector(BITVector&c,intstart,intlen);
  26. constBITVector&operator=(constBITVector&bitVector);
  27. explicitBITVector(constBITVector&bitVector);
  28. public:
  29. ~BITVector(void);
  30. };
  31. #endif

然后是bitVector.cpp文件

  1. /*createdbychicochen
  2. *date2008/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. voidBITVector::Set(intindex,intx)
  18. {
  19. if(x==0)
  20. {
  21. returnSetZero(index);
  22. }
  23. else
  24. {
  25. returnSetOne(index);
  26. }
  27. }
  28. voidBITVector::SetZero(intindex)
  29. {
  30. intinnIndex=index/bits;
  31. intbitPos=index&(bits-1);//innIndex%8
  32. if(innIndex<size)
  33. {
  34. //vectormaybehasenoughspacetostorethis.
  35. this->bitarray[innIndex]=this->bitarray[innIndex]&~(mask>>bitPos);
  36. }
  37. elseif(innIndex==size)
  38. {
  39. //shouldlargerthesizeofbitarray
  40. //andinnIndexmustbethefirstbitoflastchar
  41. if(bitPos==0)
  42. {
  43. //correct
  44. this->Larger();
  45. this->bitarray[innIndex]=this->bitarray[innIndex]&~(mask>>bitPos);
  46. }
  47. else
  48. {
  49. //error
  50. }
  51. }
  52. else
  53. {
  54. //theremaybesomethingerror,orsomecodemissing
  55. }
  56. }
  57. voidBITVector::Larger()
  58. {
  59. __int64*tempArray=new__int64[size];
  60. memcpy(tempArray,this->bitarray,sizeof(__int64)*size);
  61. delete[]this->bitarray;
  62. this->bitarray=new__int64[size*2];//maybeerror
  63. memset(bitarray,0,sizeof(__int64)*size*2);
  64. memcpy(this->bitarray,tempArray,sizeof(__int64)*size);
  65. size=size*2;
  66. delete[]tempArray;
  67. }
  68. voidBITVector::SetOne(intindex)
  69. {
  70. intinnIndex=index/bits;//youcanuse>>(bits-1)
  71. intbitPos=index%bits;//innIndex&(bits-1)
  72. if(innIndex<size)
  73. {
  74. //vectormaybehasenoughspacetostorethis.
  75. this->bitarray[innIndex]=this->bitarray[innIndex]|(mask>>bitPos);
  76. }
  77. elseif(innIndex==size)
  78. {
  79. //shouldlargerthesizeofbitarray
  80. //andinnIndexmustbethefirstbitoflastchar
  81. if(bitPos==0)
  82. {
  83. //correct
  84. this->Larger();
  85. this->bitarray[innIndex]=this->bitarray[innIndex]|(mask>>bitPos);
  86. }
  87. else
  88. {
  89. //error
  90. }
  91. }
  92. else
  93. {
  94. //theremaybesomethingerror,orsomecodemissing
  95. }
  96. }
  97. intBITVector::Get(intindex)
  98. {
  99. if(index<size*bits)
  100. {
  101. intposition=index&(bits-1);//%bits
  102. intinnIndex=index/bits;
  103. __int64i=this->bitarray[innIndex]&(mask>>position);
  104. if(i==0)
  105. {
  106. return0;
  107. }
  108. else
  109. {
  110. return1;
  111. }
  112. }
  113. throw"accessoutofthearray";
  114. }
  115. intBITVector::Size()
  116. {
  117. returnsize*bits;
  118. }
  119. //intintegeris0x01010111
  120. //startisthestartpositionofbitvector,andstartstartszero
  121. //lenislengthofthenumberofbitsyouwantsetintobitarray
  122. voidBITVector::SetInt(unsignedintinteger,intstart,intlen)
  123. {
  124. intfinalPos=start+len;
  125. inti=start;
  126. intj=0;
  127. inttemp=0;
  128. for(;i<finalPos;i++,j++)
  129. {
  130. temp=integer&(0x80000000>>j);
  131. this->Set(i,temp);
  132. }
  133. }
  134. voidBITVector::PrintfZeroOne(intstart,intlen)
  135. {
  136. intfinalPos=start+len;
  137. inttemp=0;
  138. for(inti=start;i<finalPos;i++)
  139. {
  140. printf("%d",this->Get(i));
  141. }
  142. }
  143. //startiswheretoinsertbitvectorc
  144. //lenisthelengthofbitsinserted
  145. //"start"isofthis,and"len"isofc;
  146. voidBITVector::SetBitVector(BITVector&c,intstart,intlen)
  147. {
  148. for(inti=0;i<len;i++)
  149. {
  150. this->Set(start+i,c.Get(i));
  151. }
  152. }
  153. //copyconstruct
  154. BITVector::BITVector(constBITVector&bitVector):mask(0x8000000000000000),bits(sizeof(__int64)*8)
  155. {
  156. this->size=bitVector.size;
  157. this->bitarray=new__int64[this->size];
  158. memcpy(this->bitarray,bitVector.bitarray,sizeof(__int64)*bitVector.size);
  159. }
  160. constBITVector&BITVector::operator=(constBITVector&bitVector)
  161. {
  162. if(this!=&bitVector)
  163. {
  164. this->size=bitVector.size;
  165. delete[]this->bitarray;
  166. this->bitarray=new__int64[this->size];
  167. memcpy(this->bitarray,bitVector.bitarray,sizeof(__int64)*this->size);
  168. }
  169. return*this;
  170. }
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics