C++标准库:使用bitset简化位处理
摘要:位处理在C/C++程序中广泛存在,有许多情况下位是最好的解决方案,此时就是所谓的标志位,也就是说某一事件可能发生或不发生,有两个状态,而类似的事件有很多,并且都相互独立。这种情况标志位是最好的方案。然而对位的操作于计算机直观,可于人却很难理解,所以位操作是一个噩梦。std::bitset可以把这个噩梦给消除。
作为标准库一部分可以充分说明位的处理对于许多情况的重要性和普遍性,同时也可以看出来传统的使用位运算符直接进行位操作是很不方便且容易出错,以至于标准需要为此添加额外的支持,标准给的额外支持就是std::bitset的库。
std::bitset是STL的一部分,准确地说,std::bitset是一个模板类,它的模板参数不是类型,而整形的数值(这一特性是ISO C++2003的新特性),有了它我们可以像使用数组一样使用位。下面看一个例子:
std :: bitset <8 > bs ;
我们接着看上面的代码,通过上面两行的代码我们得到一个bitset的对象bs,bs可以装入8个位,我们可以通过数组的下标运算符来存取:
bs [3 ] = true ; //把第3位设置为1,因为true可以转换为1
bs [7 ] = 0 ; //这个大家都明白了
bitset被设计为开放的,也就是说一个bitset对象可以转换为其它类型的值,典型的,我们想把一个整数设置成具有特定的位模式,我们可以简单地把一个bitset转换为一个整数:
std :: bitset <32 > bs32 (value ) ;
bs32 [15 ] = 1 ;
value =bs32. to_ulong ( ) ;
此外bitset还可以也字符串互换,这样我们就可以更直观对bitset进行操作了,我只是简单地把我们想要的”01“字符串就可以了:
std :: string str =bs. to_string ( ) ;
我可以通过bitset作为中介实现字符到整数的转换或是整数到字符串的转换。对于bitset来除去这些给操作带来方便之外,它有一些便利函数,可以进一步方便最常见了操作。此处就不作说明了,大家可以参考许多介绍STL的书目或参考本文下面给出的链接。