有些程序须要处理二进制有序集,标准库提供了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. Java线程之Java内存模型(jmm)

    一.Java内存模型(jmm) 线程通信 消息传递 重排序 顺序一致性 Happens-Before As-If-Serial

  2. BZOJ2870 最长道路tree(并查集+LCA)

    题意 (n<=50000) 题解 #include<iostream> #include<cstring> #include<cstdio> #include ...

  3. Linux ping 不通 域名 添加DNS

    修改路由配置文件 vi /etc/resolv.conf # Generated by NetworkManager #NDS nameserver 192.168.32.2 redhat7 系统优化 ...

  4. 关于Jwt的一些思考

    在使用jwt的过程中发现了两个问题续期和退出的问题. 续期 因为jwt的token在签发之后是有过期时间的,所以就存在管理这个过期时间的问题.我看网上有提出解决方案的大致有下面几个 每次更新过期时间, ...

  5. The Zen of Python, by Tim Peters

    Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Comp ...

  6. 洛谷 P1088 火星人 (全排列)

    直接调用next_permutation即可,向前的话可以调用prev_permutation #include<cstdio> #include<cctype> #inclu ...

  7. caioj 1153 扩展欧几里德算法(解不定方程)

    模板题 注意exgcd函数要稍微记一下 #include<cstdio> #include<cctype> #include<algorithm> #define ...

  8. OpenJDK源码研究笔记(三)-RandomAccess等标记接口的作用

    标识接口是没有任何方法和属性的接口. 它仅仅表明它的类属于一个特定的类型,供其他代码来测试允许做一些事情. 下面来看一个标记接口RandomAccess. public interface Rando ...

  9. PID三种参数的理解

    来源:http://blog.gkong.com/liaochangchu_117560.ashx PID是比例.积分.微分的简称,PID控制的难点不是编程,而是控制器的参数整定.参数整定的关键是正确 ...

  10. Qt之水平/垂直布局(QBoxLayout、QHBoxLayout、QVBoxLayout)

    简述 QBoxLayout可以在水平方向或垂直方向上排列控件,由QHBoxLayout.QVBoxLayout所继承. QHBoxLayout:水平布局,在水平方向上排列控件,即:左右排列. QVBo ...