模拟bitset

这并不是真正的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;

}


1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、资源 5来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。、资 5源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值