有些程序须要处理二进制有序集,标准库提供了bitset 类型,其实,bitset 是一个二进制容器。容器中每个元素都是一位二进制码,或为 0,或为 1。

bitset除了能够訪问指定下标的bit位以外。还能够把它们作为一个整数来进行某些统计。

1、定义与初始化

使用:

#include <bitset>

using std::bitset;

在定义 bitset 时,要明白 bitset 有多少位。这个位数是整型常量:

bitset<n> b;       //b 有 n 位,每位都是 0

bitset<n> b(u);    //b 是 unsigned long 型 u 的一个副本

bitset<n> b(s);    //b 是 string 对象 s 中含有的位串的副本,这个s 必须是位串,也就是二进制码串

bitset<n> b(s, pos, n); //b 是 s 中 从位置 pos 開始的 n 个位的副本。

2、bitset操作

用整值类型表示位向量的问题在于使用位操作符来设置复位和測试单独的位层次比較低也比較复杂.

比如用整值类型将第27 位设置为1, 我们这样写

quiz1 |= 1<<27;

而用bitset 来做我们能够写

quizl[ 27 ] = 1;

quiz1.set( 27 );

要使用bitset 类我们必须包括相关的头文件

#include <bitset>

bitset 有三种声明方式在缺省定义中我们仅仅需简单地指明位向量的长度比如

bitset< 32 > bitvec;声明了一个含有32 个位的bitset 对象位的顺序从0 到31 缺省情况下全部的位都被

初始化为0 为了測试bitset 对象是否含有被设置为1 的位我们能够使用any()操作当bitset

对象的一位或多个位被设置为1 时any()返回true 对于bitvec .例如以下測试

bool is_set = bitvec.any();

它的结果当然是false 相反假设bitset 对象的全部位都被设置为0 ,则none()操作返回

true 对于bitvec 測试

bool is_not_set = bitvec.none();

结果为true count()操作返回被设置为1 的位的个数.

int bits_set = bitvec.count();

我们能够用set()操作或者下标操作符来设置某个单独的位比如以下的for 循环把偶数位设置为1.

for ( int index = 0; index < 32; ++ index )

if ( index % 2 == 0 )

bitvec[ index ] = 1;类似地測试某个单独的位是否为1 也有两种方式test()操作用位置做參数返回true

或false 比如

if ( bitvec.test( 0 ))

// 我们的bitve[0] 能够工作了!

相同地我们也能够用下标操作符

cout << "bitvec: positions turned on:\n\t";

for ( int index = 0; index < 32; ++index )

if ( bitvec[ index ] )

cout << index << " ";

cout << endl;

要将某个单独的位设置为0 ,我们能够用reset()或下标操作符下列两个操作都将bitvec的第一位设为0.

// 两者等价都把第一位设置为0

bitvec.reset( 0 );

bitvec[ 0 ] = 0;

我们也能够用set()和reset()操作将整个bitset 对象的全部位设为1 或0 ,仅仅要调用对应的操作而不必传递位置參数我们就能够做到这一点.比如

// 把全部的位设置为0

bitvec.reset();

if ( bitvec.none() != true )

// 喔! 错了

// 把全部的位设置为1if ( bitvec.any() != true )

// 喔! 又错了

flip()操作翻转整个bitset 对象或一个独立的位

bitvec.flip( 0 ); // 翻转第一位

bitvec[0].flip(); // 也是翻转第一位

bitvec.flip(); // 翻转全部的位的值

还有两种方法能够构造bitset 对象它们都提供了将某位初始化为1 的方式:一种方法是为构造函数显式地提供一个无符号參数bitset 对象的前N 位被初始化为參数的对应位值,比如

bitset< 32 > bitvec2( 0xffff );

将bitvec2 的低16 位设为1

以下的bitvec3 的定义

bitset< 32 > bitvec3( 012 );

将第1 和3 位的值设置为1 如果位置从0 开0

我们还能够传递一个代表0 和1 的集合的字符串參数来构造bitset 对象例如以下所看到的

// 与bitvec3 的初始化等价

string bitval( "1010" );

bitset< 32 > bitvec4( bitval );

bitvec4 和bitvec3 的第1 和3 位都被设置为1 而其它位保持为0

bitvec.set();

3、相关函数

b.any()          //b 中是否存在置为 1 的二进制位?

b.none()         // 和b.any() 效果一样

b.count()        //b 中不存在置为 1 的二进制位吗?

b.size()         //b 中置为 1 的二进制位的个数

b[pos]           //訪问 b 中在 pos 处二进制位

b.test(pos)      //b 中在 pos 处的二进制位置为 1

b.set()          // 把 b 中全部二进制位都置为 1

b.set(pos)       //把 b 中在 pos 处的二进制位置为 1

b.reset()        //把 b 中全部二进制位都置为 0

b.reset(pos)     //把 b 中在 pos 处的二进制位置为 0

b.flip()         //把 b 中全部二进制位逐位取反

b.flip(pos)      //把 b 中在 pos 处的二进制位取反

b.to_ulong()     //用 b 中相同的二进制位返回一个 unsigned long 值

os << b          //把 b 中的位集输出到 os 流

实验代码及执行结果:

#include "stdafx.h"
#include <iostream>
#include <bitset>
using namespace std; int _tmain(int argc, _TCHAR* argv[])
{ //bitset的全部操作:
//any();none();test();bit[];set();reset();to_string();to_ulong();
//count();flip();分别用十进制。八进制,十六进制。字符串赋值。 bitset<32> bitvec(8);//0~31,将数字8转为2进制形式存储。0001000000....
bool flag = bitvec.any();//推断是否存在某位或者多位为1,有则返回true
bool flag1 = bitvec.none();//推断是否全部的位都是0,是则返回true
bool flag2 = bitvec.test(3);//測试第4位是否为1。是则返回true<<
cout<<"bitvec的值为:"<<bitvec<<endl;
cout<<"第4位为:"<<bitvec[3]<<endl;//输出第4位的值
bitvec.reset(3);//将第4位设置为0,或者bitvec[3] = 0
cout<<"bitvec.reset(3)之后第4位为:"<<bitvec[3]<<endl;//输出第4位的值
bitvec.reset();//将全部位设置为0
cout<<"bitvec.reset()之后bitvec的值为:"<<bitvec.to_string()<<endl;
bitvec.set();//将全部位设置为1
cout<<"bitvec.set()之后bitvec.to_string()的值为:"<<bitvec.to_string()<<endl;
cout<<"bitvec的值为:"<<bitvec<<endl;
cout<<"bitvec.to_ulong()的值为:"<<bitvec.to_ulong()<<endl;
cout<<"bitvec中1的个数为:"<<bitvec.count()<<endl;
bitvec = 8;
cout<<"bitvec = 8之后bitvec的值为:"<<bitvec.to_string()<<endl;
bitvec.flip();//将全部的位翻转
cout<<"bitvec.flip()之后bitvec的值为:"<<bitvec.to_string()<<endl;
bitvec.flip(0);//翻转第一位
cout<<"bitvec.flip(0)之后bitvec的值为:"<<bitvec.to_string()<<endl;
bitvec = 0xffff;//设置低16位为1
cout<<"bitvec = 0xffff之后bitvec的值为:"<<bitvec.to_string()<<endl;
bitvec = 012;//用八进制值012设置bitvec,数字前加0表示为8进制! !! cout<<"bitvec = 012之后bitvec的值为:"<<bitvec.to_string()<<endl;
string bit = "1011";
bitset<32> bitvec1(bit);//用字符串对象初始化bitset<32>对象
cout<<"bitvec1的值为:"<<bitvec1.to_string()<<endl;
string bit1 = "1111110101100011010101";
bitset<32> bitvec2(bit1,6);//用从第6位開始到字符串结束这一部分初始化bitvec2
cout<<"bitvec2的值为:"<<bitvec2.to_string()<<endl;
bitset<32> bitvec3(bit1,6,4);//用从第6位開始。长度为4这一部分初始化bitvec3;
cout<<"bitvec3的值为:"<<bitvec3.to_string()<<endl; getchar();
return 0;
}

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGF1dF96amI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

BitSet的使用的更多相关文章

  1. strtok源码 bitset 空间压缩

    源代码里有一段: unsigned char map[32]; /* Clear control map */ for (count = 0; count < 32; count++) map[ ...

  2. DFS序+线段树+bitset CF 620E New Year Tree(圣诞树)

    题目链接 题意: 一棵以1为根的树,树上每个节点有颜色标记(<=60),有两种操作: 1. 可以把某个节点的子树的节点(包括本身)都改成某种颜色 2. 查询某个节点的子树上(包括本身)有多少个不 ...

  3. 把《c++ primer》读薄(3-3 标准库bitset类型)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. //开头 #include <bitset> using std::bitset; 问题1.标准库bitset类型( ...

  4. BitSet构造函数的两种特例

    C++11之后,bitset的构造函数新加了两种形式: bitset<bits>::bitset (const string& str, string::size_type str ...

  5. Bitset<>用于unordered container时的默认hash函数

    自从c++11起,bitset用于unordered container,将会提供默认的hash函数. 在gcc中,相关代码如下: // DR 1182. /// std::hash speciali ...

  6. hdu 4920 Matrix multiplication bitset优化常数

    Matrix multiplication Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/ ...

  7. hdu 5506 GT and set dfs+bitset优化

    GT and set Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Probl ...

  8. (DFS、bitset)AOJ-0525 Osenbei

    题目地址 简要题意: 给出n行m列的0.1矩阵,每次操作可以将任意一行或一列反转,即这一行或一列中0变为1,1变为0.问通过任意多次这样的变换,最多可以使矩阵中有多少个1. 思路分析: 行数比较小,先 ...

  9. Gym 100917J---Judgement(01背包+bitset)

    题目链接 http://codeforces.com/gym/100917/problem/J Description standard input/outputStatements The jury ...

  10. C++二进制文件中读写bitset

    这个比较简单,直接上代码: bitset< > *b = >(); bitset< > *c = >(); ofstream out("I:\\test. ...

随机推荐

  1. js+css实现全局loading加载

    js var Mask = function() { //定义一个Mask对象 this.btn = ["取消", "确定"], this.init = fun ...

  2. HDU-1052 Tian Ji -- The Horse Racing 贪心 考虑特殊位置(首尾元素)的讨论

    题目链接:https://cn.vjudge.net/problem/HDU-1052 题意 田忌赛马问题扩展版 给n匹马,马的能力可以相同 问得分最大多少 思路 贪心做得还是太少,一开始一点思虑都没 ...

  3. java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized

    Exception in thread "main" java.sql.SQLException: The server time zone value 'Öйú±ê׼ʱ¼ä ...

  4. Qt之字体文件(TTF)

    简述 TTF(TrueTypeFont)是Apple公司和Microsoft公司共同推出的字体文件格式,随着windows的流行,已经变成最常用的一种字体文件表示方式. 在一些特殊的场合,系统字符集不 ...

  5. MYSQL学习笔记三:日期和时间函数

    MYSQL学习笔记三:日期和时间函数 1. 获取当前日期的函数和获取当前时间的函数 /*获取当前日期的函数和获取当前时间的函数.将日期以'YYYY-MM-DD'或者'YYYYMMDD'格式返回 */ ...

  6. 腾讯之困,QQ与微信各有各的烦恼

    QQ渐渐在腾讯内部弱化 在PC时代,QQ是即时通讯领域当之无愧的王者.但在微信崛起后,手机QQ未来会被微信替代的判断喧嚣至上. 早在2012年就有传言腾讯在游戏领域開始去"娱乐化" ...

  7. An existing connection was forcibly closed by the remote host

    StackOverflow https://stackoverflow.com/questions/5420656/unable-to-read-data-from-the-transport-con ...

  8. HDU 4786Fibonacci Tree(最小生成树)

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

  9. CSS之基于不同场景的垂直居中解决方案

    元素的水平居中,如果是一个行内元素,就对它的父元素应用 “text-align:center”: 如果是一个块级元素,就对它自身应用“margin:auto”. 垂直居中的几种场景以及实现方法: 一. ...

  10. AngularJs轻松入门(二)数据绑定

    数据绑定是AngularJs中非常重要的特性,我们看一下下面的例子: <!DOCTYPE html> <html ng-app> <head lang="en& ...