其实c++里有bitset这个类,但是bitset使用时必须给定大小。例如
bitset<8> c;//这里必须在编码里写死,不能使用变量替代
c = 234;
我主要是用这个东西来存储可变长的huffman编码。所以这个类对我根本不能用。除非开始就给一个足够大的bitset。
所以我创建里一个可变长的bit vector用于存放Huffman编码。
在这里内部使用的是__int64,64位。当然根据实际需要可以将这个做为模板传入,不过现在还没有这样编码。
-
-
#ifndef_BIT_VECTOR_
-
#define_BIT_VECTOR_
-
#include<iostream>
-
usingnamespacestd;
-
classBITVector
- {
-
private:
-
__int64*bitarray;
-
constintbits;
-
constunsigned__int64mask;
-
intsize;
-
voidSetOne(intindex);
-
voidSetZero(intindex);
-
voidLarger();
-
public:
-
BITVector(void);
-
voidSet(intindex,intx);
-
intGet(intindex);
-
intSize();
-
voidSetInt(unsignedintinteger,intstart,intlen);
-
voidPrintfZeroOne(intstart,intlen);
-
voidSetBitVector(BITVector&c,intstart,intlen);
-
constBITVector&operator=(constBITVector&bitVector);
-
explicitBITVector(constBITVector&bitVector);
-
public:
-
~BITVector(void);
- };
-
#endif
然后是bitVector.cpp文件
-
-
#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);
-
if(innIndex<size)
- {
-
-
this->bitarray[innIndex]=this->bitarray[innIndex]&~(mask>>bitPos);
- }
-
elseif(innIndex==size)
- {
-
-
-
if(bitPos==0)
- {
-
-
this->Larger();
-
this->bitarray[innIndex]=this->bitarray[innIndex]&~(mask>>bitPos);
- }
-
else
- {
-
- }
- }
-
else
- {
-
- }
- }
-
voidBITVector::Larger()
- {
-
__int64*tempArray=new__int64[size];
-
memcpy(tempArray,this->bitarray,sizeof(__int64)*size);
-
delete[]this->bitarray;
-
this->bitarray=new__int64[size*2];
-
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;
-
intbitPos=index%bits;
-
if(innIndex<size)
- {
-
-
this->bitarray[innIndex]=this->bitarray[innIndex]|(mask>>bitPos);
- }
-
elseif(innIndex==size)
- {
-
-
-
if(bitPos==0)
- {
-
-
this->Larger();
-
this->bitarray[innIndex]=this->bitarray[innIndex]|(mask>>bitPos);
- }
-
else
- {
-
- }
- }
-
else
- {
-
- }
- }
-
intBITVector::Get(intindex)
- {
-
if(index<size*bits)
- {
-
intposition=index&(bits-1);
-
intinnIndex=index/bits;
-
__int64i=this->bitarray[innIndex]&(mask>>position);
-
if(i==0)
- {
-
return0;
- }
-
else
- {
-
return1;
- }
- }
-
throw"accessoutofthearray";
- }
-
intBITVector::Size()
- {
-
returnsize*bits;
- }
-
-
-
-
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));
- }
- }
-
-
-
-
voidBITVector::SetBitVector(BITVector&c,intstart,intlen)
- {
-
for(inti=0;i<len;i++)
- {
-
this->Set(start+i,c.Get(i));
- }
- }
-
-
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;
- }
分享到:
相关推荐
gdi bmp bitbit dll array .
位数组是一个可变大小的位数组的实现。 数组基于零索引。 示例用法: ary := bitarray.New(10)ary.IsSet(2) //falseary.Set(2)ary.IsSet(2) //trueary.String() // 0010000000ary.Unset(2)ary.IsUnset(2) //trueary....
位数组-Javascript数据类型扩展BitArray的工作方式类似于常规Array对象。 事实上,任何你可以做index.Of lastIndexOf slice splice join reverse filter sort等,你可以用一个BitArray实例做。 请记住,元素将始终是...
使用以下任一方法创建对象时,位数组可能具有指定的可变长度: 一个特定的大小; 可遍历的集合; 位的字符串表示形式; 位的json表示; 来自另一个位数组的切片; 来自其他两个位数组的串联。 该项目提供了...
位数组高效的内存布尔数组实现,非常易于使用安装 npm install zo-bitarray --save用法 const BitArray = require ( 'zo-bitarray' ) let ba = new BitArray ( '1010101010' ) ba . get ( 0 ) //1 ba . count ( ) //...
python库。资源全名:bitarray-2.3.3.tar.gz
bitarray_cpp-0.4.zip, 位运算封装,非常方便好用; bitarray;
位数组 一组函数,用于处理C语言中的动态位数组。... 要在内存中分配指定数量的Bit,请创建一个BitArray或增加一个预先设置大小的BitArray; 使用allocBit函数: bitArray = allocBit(bitArray, num
bitarray-2.2.5-cp38-cp38-win32
The Bit Array structure provides a compacted arrays of Booleans, with one bit for each Boolean value. A 0 [1] bit corresponds to the Boolean value false [true], respectively. We can look at a stream ...
bitarray-1.2.1-cp35-cp35m-win32
python 引用impala所需包 bitarray-1.0.1-cp35-cp35m-win_amd64.whl
bitarray-2.2.5-cp37-cp37m-win_amd64
bitarray-1.2.1-cp27-cp27m-win_amd64
python安装用到包bitarray-0.8.3.tar.gz、impyla-0.14.1.tar.gz、six-1.4.1.tar.gz、thrift.rar
Python的bitarray第三方库。直接通过setting会报错。下载该资源文件后,通过cmd,输入“pip install 存放下载的该资源的地址”即可顺利安装。注意:该资源包适用于Python3.6
bitarray-2.2.5-cp38-cp38-win_amd64
bitarray-0.8.3-cp37-cp37m-win_amd64 Python3.7安装包 下载之后直接pip安装即可
位阵列执照: 分支,函数,行,语句: 使用BitArray节省内存...尺寸2.9 KB安装通过npm npm install bit-array 通过纱线yarn add bit-array 开发者npm install yarn install yarn start 文献资料用法import BitArray
bitarray-2.2.5-cp39-cp39-win_amd64