C++中bitset的实现(引用类的使用)

#include <iostream>
#include <string.h>
#define CHAR_BIT 8
using namespace std;

template<size_t _N>
class bitset
{
	typedef unsigned long _Ty;
	friend ostream & operator << (ostream &_O,const bitset<_N> &_R)
	{
		for(size_t _P=_N;_P>0;)
			_O<<(_R.test(--_P)?'1':'0');
		return _O;
	}
	public:
	class reference
	{
		public:
		friend class bitset<_N>;
		reference &operator=(bool _X)
		{
			_Pbs->set(_Off,_X);
			return *this;
		}
		reference& operator=(const reference &_Bs)
		{
	  		_Pbs=_Bs._Pbs;
	  		_Off=_Bs._Off;
			  return *this;
		}
		operator bool()const
		{
			return _Pbs->test(_Off-1);
		}
		bool operator~()const
		{
			_Pbs->flip(_Off);
		}
		bool operator &(const reference &_Bs)
		{
			return (_Pbs->test(_Off-1)&_Bs._Pbs->test(_Bs._Off-1));
		}
		private:
		reference(bitset<_N> *_X,size_t _P):_Pbs(_X),_Off(_P){}
		bitset<_N> *_Pbs;
		size_t _Off;
	};

bool at(size_t _P)const
 {
  return test(_P);
 }

bool operator[](size_t _P)const
	{
		return test(_P);
	}
reference operator[](size_t _P)
	{
		return reference(this,_P);
	}
	bitset()
	{
		_Tidy();
	}
	bitset(const string &_S)
	{
	 	_Tidy();
		int _I=0;
		while(_S[_I]!='\0')
		{
			int _D = _S[_I]=='1'?1:0;
			_I++;
			set(_I,_D);
		}
	}
	bitset(int x)
	{
		_Tidy();
		_A[0]|=(_Ty)x;
	}
	bitset(const string &_S,int _X)
	{
		_Tidy();
		int _I=0;
		while(_S[_I]!='\0')
		{
			int _D = _S[_I]=='1'?1:0;
			_I++;
			set(_I,_D);
		}
		set(_X,1);
	}
  bitset<_N>& set()
	{
				_Tidy(~(_Ty)0);
				return *this;
	}
	bitset<_N>& set(size_t _P, bool _X = true)
	{
		if(_X)
	 _A[_P/_Nb] |= ((_Ty)0x1<<(_P%(_N+1))-1);
		else
		{
			_A[_P/_Nb] &= ~((_Ty)0x1<<(_P%(_N+1))-1);
		}
	return *this;
	}
	bitset<_N>& reset()
	{
			_Tidy();
			return *this;
	}
	bitset<_N>& reset(size_t _P)
	{
		set(_P,0);
		return *this;
	}
	bitset<_N>& flip()
	{
		for(int _I=0;_I<=_Nw;_I++)
		{
			_A[_I]^=(~(_Ty)0x0);
		}
		_Trim();
	}
	bitset<_N>& flip(size_t _P)
	{
		_A[_P/_Nb] ^= ((_Ty)0x1<<(_P%(_Nb+1)-1));
		return *this;
	}
	size_t size()const
	{
		return _N;
	}
	size_t count()const
	{
	 size_t _V=0;
		for(int _I=_Nw;_I>=0;--_I)
			for(_Ty _X=_A[_I];_X!=0;_X>>=4)
			_V+="\0\1\1\2\1\2\2\3\1\2\2\3\2\3\3\4"[0xff&_X];
		return _V;
	}
	bitset<_N> operator~()
	{
		for(int _I=0;_I<=_Nw;++_I)
			_A[_I]=~_A[_I];
		_Trim();
		return *this;
	}
	unsigned long to_ulong() const
	{
		enum{_Assertion=1/(sizeof(unsigned long)%sizeof(_Ty)==0)};
		int _I = _Nw;
		for(;sizeof(unsigned long)/sizeof(_Ty)<=_I;--_I)
				if(_A[_I]!=0)
					break;
		unsigned long _V=_A[_I];
		for(;0<=--_I;)
			_V=_V<<_Nb|_A[_I];
		return (_V);
	}
	string to_string()const
	{
		string _S;
		for(int _I=0;_I<=_Nw;_I++)
		{
			for(int _X=_A[_I];_X!=0;)
				{
				_S+=((_X&((_Ty)0x1))==1?"1":"0");
				_X>>=1;
				}
		}
		return _S;
	}
	bool any()const
	{
		for(int _I=0;_I<=_Nw;++_I)
			if(_A[_I]!=0)
				return true;
		else	return false;
	}
	bool none()const
	{
		return !any();
	}
	bitset<_N>& operator&=(const bitset<_N> &_R)
	{
			for(int _I=0;_I<=_Nw;_I++)
					_A[_I]&=_R._A[_I];
			return *this;
	}
	bitset<_N>& operator|=(const bitset<_N> &_R)
	{
			for(int _I=0;_I<=_Nw;_I++)
					_A[_I]|=_R._A[_I];
			return *this;
	}
	bitset<_N>& operator^=(const bitset<_N> &_R)
	{
			for(int _I=0;_I<=_Nw;_I++)
				_A[_I]^=_R._A[_I];
			return *this;
	}
	friend bitset<_N> operator&(const bitset<_N> &_L, const bitset<_N> &_R)
	{
		return (bitset<_N>(_L)&=_R);
	}
	friend bitset<_N> operator|(const bitset<_N> &_L, const bitset<_N> &_R)
	{
		return (bitset<_N>(_L)|=_R);
	}
	friend bitset<_N> operator^(const bitset<_N> &_L, const bitset<_N> &_R)
	{
		return (bitset<_N>(_L)^=_R);
	}
	bitset<_N>& operator<<=(size_t _P)
	{
	int _D = _P/_Nb;
	if(_D!=0)
	{
	int _I;
		for( _I=_Nw;_I>0;_I--)
			  {
				_A[_I] = _D<=_I?_A[_I-_D]:0;
				}
			for(int _J=0;_J<_D-1;_J++)
				_A[_J] = 0;
	}
	if(_P%_Nb!=0)
	{
		int _I = _Nw;
		for(;_I>0;--_I)
		{
			_A[_I]=(_A[_I]<<(_P%_Nb))|(_A[_I-1]>>(_Nb-_P%_Nb));
		}
	}
		_A[0]<<=(_P%_Nb);
		_Trim();
		return *this;
	}
	bitset<_N>& operator>>=(size_t _P)
	{
		int _D = _P/_Nb;
		if(_D!=0)
		{
			int _I;
			for(_I=0;_I<=_Nw;_I++)
			{
				_A[_I] = _I+_D<=_Nw?_A[_I+_D]:0;
			}
			for(int _J=0;_J<_D;_J++)
				_A[_Nw-_J]=0;
		}
		if(_P%_Nb!=0)
		{
			int _I = 0;
			for(;_I<_Nw;++_I)
			{
				_A[_I]=(_A[_I]>>(_P%_Nb))|(_A[_I+1]<<(_Nb-_P%_Nb));
			}
		}
		_A[_Nw]>>=(_P%_Nb);
		_Trim();
		return *this;
	}
	friend bitset<_N> operator<<(const bitset<_N> &_L, size_t _P)
	{
		return bitset<_N>(_L)<<=_P;
	}
	friend bitset<_N> operator>>(const bitset<_N> &_L,size_t _P)
	{
		return bitset<_N>(_L)>>=_P;
	}
	private:
	bool test(size_t _P)const
	{
		return (((_A[_P/_Nb]) & (0x1<<(_P%_Nb)))!=0);
	}
	void _Tidy(_Ty _X=0)
	{
		for(int _I=_Nw;_I>=0;--_I)
			_A[_I]=_X;
		 if(_X!=0)
				_Trim();
	}
	void _Trim()
	{
		if(_N%_Nb!=0)
	 	    _A[_Nw]&=(((_Ty)0x1<<_N%_Nb)-1);
	}
	enum
	{
		_Nb=CHAR_BIT*sizeof(_Ty),
		_Nw = _N==0?0:(_N-1)/_Nb,
	};
	_Ty _A[_Nw+1];
};
int main()
{
	bitset<10> bt1;
	bt1[2]=1;
	bitset<10> bt2;
	bt2[2]=1;
	cout<<(bt1[2]&bt2[2])<<endl;
	return 0;
}

时间: 2024-09-17 16:05:34

C++中bitset的实现(引用类的使用)的相关文章

Java中引用类 strong reference .SoftReference 、 WeakReference 和 PhantomReference的区别

当在 Java 2 平台中首次引入 java.lang.ref 包,其中包含 SoftReference . WeakReference 和 PhantomReference 三个引用类,引用类的主要功能就是能够引用仍可以被垃圾收集器回收的对象.在引入引用类之前,我们只能使用强引用(strong reference).举例来说,下面一行代码显示的就是强引用 obj : Object obj = new Object(); obj 这个引用将引用堆中存储的一个对象.只要 obj 引用还存在,垃圾收

引用类中的enum

引用类中的enum,需要加类的域class_name::value_in_enum_name 点击(此处)折叠或打开 #include <stdio.h> #include <stdlib.h> class A{ public: enum ee{ a = 0, b, max }; }; class B{ public: enum ee{ a = 1, b, max }; }; int main ( int argc, char *argv[] ) { printf("%d

ios 中Category类别(扩展类)专题总结

原创地址   http://www.code4blog.com/archives/294 类别 类别是一种为现有的类添加新方法的方式. 利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,包括那些没有源代码的类. 类别使得无需创建对象类的子类就能完成同样的工作 一.创建类别 1.声明类别 声明类别与声明类的形式很相似 @interface  NSString(NumberConvenienc

ios 中Category类别(扩展类)小结

类别 类别是一种为现有的类添加新方法的方式.利用Objective-C的动态运行时分配机制,可以为现有的类添加新方法,这种为现有的类添加新方法的方式称为类别catagory,他可以为任何类添加新的方法,包括那些没有源代码的类.类别使得无需创建对象类的子类就能完成同样的工作一.创建类别1.声明类别声明类别与声明类的形式很相似 @interface  NSString(NumberConvenience)-(NSNumber *)lengthAsNumber;@end//NumberConvenie

关于Java中的几种特殊类与接口,及特殊的创建实例的方法

Java中有一些特殊的类,在教材中讲解的不深,但是确实非常有用的,这里总结一下,里面用到的有网上搜到的内容,这里表示下感谢. 一.成员内部类 成员内部类是在一个内中定义的另外一个类,这个类属于其上的类的成员,叫做成员内部类.可以把该类看做是一个成员,可实例化的成员.该类主要作用是代替结构体功能,当一个类使用到的某个成员是一个结构类型,但是该结构又没有通用性,此时就可以声明为内部类,这样便解决了结构体的问题. 注意:内部类是一个编译时的概念,一旦编译成功,就会成为完全不同的两类.对于一个名为out

[Swift]Day15:闭包中的循环强引用

闭包中的循环强引用 解决闭包和类实例之间的循环强引用可以通过定义捕获列表来实现. 捕获列表 捕获列表中的每个元素都是由weak或者unowned关键字和实例的引用(如self)成对组成.每一对都在方括号中,通过逗号分开: lazy var someClosure: (Int, String) -> String = { [unowned self] (index: Int, stringToProcess: String) -> String in } 我们需要判断捕获列表中的属性是弱引用还是

【转 Java 中的内部类和匿名类

 Java 中的内部类和匿名类 2008-10-16 13:47:41 标签:Java 内部类 匿名类 休闲 职场 Java 中的内部类和匿名类* 为什么需要内部类? Java 内部类有什么好处?为什么需要内部类? 首先举一个简单的例子,如果你想实现一个接口,但是这个接口中的一个方法和你构想的这个类中的一个方法的名称,参数相同,你应该怎么办?这时候,你可以建一个内部类实现这个接口.由于内部类对外部类的所有内容都是可访问的,所以这样做可以完成所有你直接实现这个接口的功能. 不过你可能要质疑,更改一

浅谈Java中的对象和引用

浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是"对象和对象引用",很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起了解一下对象和对象引用之间的区别和联系. 1.何谓对象? 在Java中有一句比较流行的话,叫做"万物皆对象",这是Java语言设计之初的理念之一.要理解什么是对象,需要跟类一起结合起来理解.下面这段话引自<Java编程思想>中的一段原话: "按照通

JAVA中的四种引用以及ReferenceQueue和WeakHashMap的使用示例

简介: 本文主要介绍JAVA中的四种引用: StrongReference(强引用).SoftReferenc(软引用).WeakReferenc(弱引用).PhantomReference(虚引用)的作用.同时我们还将介绍ReferenceQueue和WeakHashMap的功能和使用示例. 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. JAVA中的四种引用 四种引用中,软引用.若引用.虚引用都需要相关类来创建.创建的时候

重温java中的String,StringBuffer,StringBuilder类

任何一个系统在开发的过程中, 相信都不会缺少对字符串的处理. 在 java 语言中, 用来处理字符串的的类常用的有 3 个: String.StringBuffer.StringBuilder. 它们的异同点: 1) 都是 final 类, 都不允许被继承; 2) String 长度是不可变的, StringBuffer.StringBuilder 长度是可变的; 3) StringBuffer 是线程安全的, StringBuilder 不是线程安全的. String 类已在上一篇随笔 小瓜牛