bitset

bitSet.h

#ifndef BITSET_H
#define BITSET_H

#include<assert.h>
#include<iostream>
using namespace std;

const int DefaultSize=50;
/*
16位无符号短整数实现位映射
*/
template<typename T>
class bitSet{
public:
bitSet(int sz=DefaultSize);
bitSet(const bitSet<T>& R);
~bitSet(){
delete []bitVector;
}
void makeEmpty(){
for(int i=0;i<vectorSize;i++)
bitVector[i]=0;
}
unsigned short getMember(const T x);
void putMember(const T x,unsigned short v);
bool addMember(const T x);
bool delMember(const T x);
bitSet<T>& operator=(const bitSet<T>& R);
bitSet<T>& operator+(const bitSet<T>& R);
bitSet<T>& operator*(const bitSet<T>& R);
bitSet<T>& operator-(const bitSet<T>& R);
bool Contains(const T x);
bool subSet(bitSet<T>& R);
bool operator==(bitSet<T>& R);
friend istream& operator>>(istream& in,bitSet<T>& R);
friend ostream& operator<<(ostream& out,bitSet<T>& R){
for(int i=0;i<R.setSize;i++){
out << R.bitVector[i] << ",";
}
out << endl;
return out;
}

private:
int setSize;
int vectorSize;
unsigned short *bitVector;
};

#endif // BITSET_H


bitSet.cpp

#include"bitSet.h"
#include<iostream>
using namespace std;

template<typename T>
bitSet<T>::bitSet(int sz):setSize(sz)
{
assert(setSize>0);
vectorSize = (setSize+15)>>4;
bitVector = new unsigned short[vectorSize];
assert(bitVector!=NULL);
for(int i=0;i<vectorSize;++i)
bitVector[i]=0;
}

template<typename T>
bitSet<T>::bitSet(const bitSet<T> &R)
{
setSize=R.setSize;
vectorSize=R.vectorSize;
bitVector = new unsigned short[vectorSize];
for(int i=0;i<R.vecterSize;++i){
bitVector[i]=R.bitVector[i];
}
assert(bitVector!=NULL);
}

/*
获得集合元素x在bitVector中相应位置的值
*/
template<typename T>
unsigned short bitSet<T>::getMember(const T x)
{
int ad=x/16,id=x%16;
unsigned short elem=bitVector[ad];
return ((elem>>(15-id))%2);
}

template<typename T>
void bitSet<T>::putMember(const T x,unsigned short v)
{
int ad=x/16,id=x%16;
unsigned short elem=bitVector[ad];
unsigned short temp=elem>>(15-id);
elem=elem<<(id+1);
if(temp%2==0&&v==1)
temp+=1;
else if(temp%2==1&&v==0)
temp-=1;
bitVector[ad]=(temp<<(15-id))|(elem>>(id+1));
}

template<typename T>
bool bitSet<T>::addMember(const T x)
{
assert(x>=0&&x<setSize);
if(getMember(x)==0){
putMember(x,0);
return true;
}
return false;
}

template<typename T>
bitSet<T>& bitSet<T>::operator+(const bitSet<T>& R)
{
assert(vectorSize==R.vecterSize);
bitSet temp(vectorSize);
for(int i=0;i<vectorSize;++i){
temp.bitVector[i]=bitVector[i]|R.bitVector[i];
}
return temp;
}

template<typename T>
bitSet<T>& bitSet<T>::operator*(const bitSet<T>& R)
{
assert(vectorSize==R.vecterSize);
bitSet temp(vectorSize);
for(int i=0;i<vectorSize;++i){
temp.bitVector[i]=bitVector[i]&R.bitVector[i];
}
return temp;
}

template<typename T>
bitSet<T>& bitSet<T>::operator-(const bitSet<T>& R)
{
assert(vectorSize==R.vecterSize);
bitSet temp(vectorSize);
for(int i=0;i<vectorSize;++i){
temp.bitVector[i]=bitVector[i]&!R.bitVector[i];
}
return temp;
}

template<typename T>
bool bitSet<T>::Contains(const T x)
{
assert(x>=0&&x<=setSize);
return getMemeber(x)==1?true:false;
}

template<typename T>
bool bitSet<T>::subSet(bitSet<T> &R)
{
assert(setSize==R.setSize);
for(int i=0;i<vectorSize;++i){
if(bitVector[i]&!R.bitVector[i])
return false;
}
return true;
}

template<typename T>
bool bitSet<T>::operator==(bitSet<T>& R)
{
assert(setSize==R.setSize);
for(int i=0;i<setSize;++i){
if(bitVector[i]!=R.bitVector[i])
return false;
}
return true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值