这并不是真正的bitset,只是用一些简单的c++知识来模仿bitset,所以数据类型跟真正的bitset会有所不同,请留意算术右移跟逻辑右移的问题。
#define N 5
const int max_length = 32 * N;//这个数字共有32*5位。从第0位到第max_length-1位,第0位是最低位。
class bitset {
private:
int a[N];//一个int32位,所以只用开N个int
public:
bitset();//默认构造函数,所有位初始化为0
void set(int pos);//把位置pos设置成1
void reset(int pos);//将位置pos设置成0
int count() const;//输出一共有多少个为1的位
bool test(int pos) const;//位置pos是否是1
bool any() const;//是否有是1的位
bool none() const;//是否没有是1的位
bool all() const;//是否所有位都是1
//位运算部分和普通数字的位运算相同。
bitset& operator&= (const bitset& b);
bitset& operator|= (const bitset& b);
bitset& operator^= (const bitset& b);
bitset& operator= (const bitset& b);
bitset& operator <<= (int pos);
bitset& operator >>= (int pos);
bitset operator~() const;
bitset operator&(const bitset& b) const;
bitset operator|(const bitset& b) const;
bitset operator^(const bitset& b) const;
bitset operator<<(int pos) const;
bitset operator>>(int pos) const;
bool operator== (const bitset& b) const;
bool operator!= (const bitset& b) const;
bool operator[] (int pos) const;//返回位置pos是不是1.
//输出部分已经实现
题解如下
#include<iostream>
#include<cmath>
#include"Bitset.h"
using namespace std;
bitset::bitset(){
int i;
for(i = 0;i < N;i++) a[i] = 0;
}
void bitset::set(int pos)
{
int p = pos/32;
int t = pos%32;
a[p] |= 1<<t;
}
void bitset::reset(int pos)
{
int p = pos/32;
int t = pos%32;
a[p] &= ~(1<<t);
}
int bitset::count() const
{
int num = 0;
for (int i = N-1; i >= 0; i--) {
for (int j = 31; j >= 0; j--) {
if (a[i] & (1 << j)) num++;
}
}
return num;
}
bool bitset::test(int pos) const
{
int p = pos/32;
int t = pos%32;
return (a[p]&(1<<t));
}
bool bitset::any() const
{
return count() > 0;
}
bool bitset::none()const
{
return count() == 0;
}
bool bitset::all()const
{
return max_length == count();
}
bitset& bitset::operator&= (const bitset& m)
{
for (int i=0; i<N; ++i)
a[i] &= m.a[i];
return *this;
}
bitset& bitset::operator|=(const bitset& m)
{
for (int i=0; i<N; ++i)
a[i] |= m.a[i];
return *this;
}
bitset& bitset::operator^=(const bitset& m)
{
for (int i=0; i<N; ++i)
a[i] ^= m.a[i];
return *this;
}
bitset& bitset::operator=(const bitset& m)
{
for(int i = 0;i < 5;i++)
a[i] = m.a[i];
return *this;
}
bitset& bitset::operator <<=(int pos)
{
bitset temp = *this;
int i;
for(i = 0;i < 5;i++)
{
a[i] = 0;
}
for(i = 0;i < 160-pos;i++)
{
if(temp.test(i)){
set(i+pos);
}
else reset(i+pos);
}
return *this;
}
bitset& bitset::operator >>=(int pos)
{
bitset temp = *this;
int i;
for(i = 0;i < 5;i++)
{
a[i] = 0;
}
for(i = pos;i < 160;i++)
{
if(temp.test(i))set(i-pos);
else reset(i-pos);
}
for(i = 0;i < pos;i++)
{
set(159-i);
}
return *this;
}
bitset bitset::operator~()const
{
bitset temp;
for (int i=0; i<N; i++)
temp.a[i] = ~a[i];
return temp;
}
bitset bitset::operator&(const bitset& m) const
{
bitset temp;
temp = *this;
temp &= m;
return temp;
}
bitset bitset::operator|(const bitset& m) const
{
bitset temp;
temp = *this;
temp |= m;
return temp;
}
bitset bitset::operator^(const bitset& m)const
{
bitset temp;
temp = *this;
temp ^= m;
return temp;
}
bitset bitset::operator <<(int pos)const
{
bitset temp;
temp = *this;
temp <<= pos;
return temp;
}
bitset bitset::operator>>(int pos)const
{
bitset temp;
temp = *this;
temp >>= pos;
return temp;
}
bool bitset::operator==(const bitset& m) const
{
for(int i = 0;i < 5;i++)
if(a[i] != m.a[i]) return false;
return true;
}
bool bitset::operator!=(const bitset& m) const
{
return !(*this == m);
}
bool bitset::operator[](int pos) const
{
if(test(pos))return true;
else return false;
}