BitSet的使用
有些程序须要处理二进制有序集,标准库提供了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的使用的更多相关文章
- strtok源码 bitset 空间压缩
源代码里有一段: unsigned char map[32]; /* Clear control map */ for (count = 0; count < 32; count++) map[ ...
- DFS序+线段树+bitset CF 620E New Year Tree(圣诞树)
题目链接 题意: 一棵以1为根的树,树上每个节点有颜色标记(<=60),有两种操作: 1. 可以把某个节点的子树的节点(包括本身)都改成某种颜色 2. 查询某个节点的子树上(包括本身)有多少个不 ...
- 把《c++ primer》读薄(3-3 标准库bitset类型)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. //开头 #include <bitset> using std::bitset; 问题1.标准库bitset类型( ...
- BitSet构造函数的两种特例
C++11之后,bitset的构造函数新加了两种形式: bitset<bits>::bitset (const string& str, string::size_type str ...
- Bitset<>用于unordered container时的默认hash函数
自从c++11起,bitset用于unordered container,将会提供默认的hash函数. 在gcc中,相关代码如下: // DR 1182. /// std::hash speciali ...
- hdu 4920 Matrix multiplication bitset优化常数
Matrix multiplication Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/ ...
- 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 ...
- (DFS、bitset)AOJ-0525 Osenbei
题目地址 简要题意: 给出n行m列的0.1矩阵,每次操作可以将任意一行或一列反转,即这一行或一列中0变为1,1变为0.问通过任意多次这样的变换,最多可以使矩阵中有多少个1. 思路分析: 行数比较小,先 ...
- Gym 100917J---Judgement(01背包+bitset)
题目链接 http://codeforces.com/gym/100917/problem/J Description standard input/outputStatements The jury ...
- C++二进制文件中读写bitset
这个比较简单,直接上代码: bitset< > *b = >(); bitset< > *c = >(); ofstream out("I:\\test. ...
随机推荐
- 【转载】如何学习C++
原文地址: http://www.hankcs.com/program/cpp/how_to_learn_c__.html 1.把C++当成一门新的语言学习(和C没啥关系!真的.): 2.看<T ...
- python_if_else,while,break
#密码密文展示,getpass在pycharm中无法使用,只能在python中使用import getpass #登录判断'''raw_name="Monica"raw_passw ...
- php持续集成环境笔记
记录下php集成环境中若干个工具的安装步骤和过程: 安装pear wget http://pear.php.net/go-pear.phar $ php go-pear.phar 使用:pear in ...
- O(1)复杂度增加和删除和随机取
题目: https://leetcode.com/problems/insert-delete-getrandom-o1-duplicates-allowed 非常好的解法: https://disc ...
- 零基础学python-6.2 共享引用
这一章节说说共享引用 我们先举一个样例 a=1 b=a 上面的样例就是共享引用,这里我们说说整个过程: 1.创建一个对象1 2.创建一个变量a 3.把a和1所在的内存空间连接起来.就是a引用1 4.a ...
- Ubuntu 10.04 右上角网络管理图标消失的解决的方法
那个显示网络状态的那个图标.叫做:network-manager.假设是有线网络连接的话.是上下两个箭头,假设是无线网络的话.是一个发射信号的形状. sudo gedit /etc/Ne ...
- 图像手工画效果【QT+OpenCV】
效果例如以下 [木雕]
- Python: PS 滤镜--碎片特效
本文用 Python 实现 PS 滤镜中的碎片特效,这个特效简单来说就是将图像在 上,下,左,右 四个方向做平移,然后将四个方向的平移的图像叠加起来做平均.具体的效果图可以参考之前的博客 http:/ ...
- 关于webpack插件
1.HtmlWebpackPlugin 插件 这个插件的作用是依据一个简单的index.html模板,生成一个自动引用你打包后的JS文件的新index.html.这在每次生成的js文件名称不同时非常有 ...
- Metasploit的armitage初步使用
armitage的启动 root@kali:~# armitage 别急,过会儿就好了 . 等扫描完会弹出一个框框然后会多出目标的图标比如目标是打印机