bitset

bitset这个东西,是c++里面封装好了的处理多位运算的东西。

亲测比自己写快10倍以上。

以下是概念:

std::bitset是STL的一部分,准确地说,std::bitset是一个模板类,它的模板参数不是类型,而整形的数值(这一特性是ISO C++2003的新特性),有了它我们可以像使用数组一样使用位。下面看一个例子:

#include<bitset>

std::bitset<8> bs;//它是一个模板,传递的参数告诉编译器bs有8个位。

我们接着看上面的代码,通过上面两行的代码我们得到一个bitset的对象bs,bs可以装入8个位,我们可以通过数组的下标运算符来存取:

bs[0]=1;//把第0位设置为1

bs[3]=true;//把第3位设置为1,因为true可以转换为1

bs[7]=0;//这个大家都明白了

bitset被设计为开放的,也就是说一个bitset对象可以转换为其它类型的值,典型的,我们想把一个整数设置成具有特定的位模式,我们可以简单地把一个bitset转换为一个整数:

unsigned long value=bs.to_ulong();

std::bitset<32> bs32(value);

bs32[15]=1;

value=bs32.to_ulong();

此外bitset还可以也字符串互换,这样我们就可以更直观对bitset进行操作了,我只是简单地把我们想要的”01“字符串就可以了:

std::bitset<32> bs("011010101001");

std::string str=bs.to_string();

//=======================================

bitset<n> b;

b有n位,每位都为0.参数n可以为一个表达式.

如bitset<5> b0;则"b0"为"00000";

bitset<n> b(unsigned long u);

b有n位,并用u赋值;如果u超过n位,则顶端被截除

如:bitset<5>b0(5);则"b0"为"00101";

bitset<n> b(string s);

b是string对象s中含有的位串的副本

string bitval("10011");

bitset<5> b0(bitval4);

则"b0"为"10011";

bitset<n> b(s, pos);

b是s中从位置pos开始位的副本,前面的多余位自动填充0;

string bitval("01011010");

bitset<10> b0(bitval5, 3);

则"b0" 为 "0000011010";

bitset<n> b(s, pos, num);

b是s中从位置pos开始的num个位的副本,如果num<n,则前面的空位自动填充0;

string bitval("11110011011");

bitset<6> b0(bitval5, 3, 6);

则"b0" 为 "100110";

// 流

os << b

把b中的位集输出到os流

os >>b

输入到b中,如"cin>>b",如果输入的不是0或1的字符,只取该字符前面的二进制位.

// 属性方法

bool any()

是否存在置为1的二进制位?和none()相反

bool none()

是否不存在置为1的二进制位,即全部为0?和any()相反.

size_t count()

二进制位为1的个数.

size_t size()

二进制位的个数

flip()

把所有二进制位逐位取反

flip(size_t pos)

把在pos处的二进制位取反

bool operator[](size_type _Pos)

获取在pos处的二进制位

set()

把所有二进制位都置为1

set(pos)

把在pos处的二进制位置为1

reset()

把所有二进制位都置为0

reset(pos)

把在pos处的二进制位置为0

test(size_t pos)

在pos处的二进制位是否为1?

unsigned long to_ulong()

用同样的二进制位返回一个unsigned long值

string to_string()

返回对应的字符串.

时间: 2024-10-09 04:47:18

bitset的相关文章

bitset bitmap 海量数据处理

bitmap:是一个十分有用的结构.所谓的Bit-map就是用一个bit位来标记某个元素对应的Value, 而Key即是该元素.由于采用了Bit为单位来存储数据,因此在存储空间方面,可以大大节省.      适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围是int的10倍以下 基本原理及要点:使用bit数组来表示某些元素是否存在,比如8位电话号码 扩展:bloom filter可以看做是对bit-map的扩展 问题实例: 1)已知某个文件内包含一些电话号码,每个号码为8位数字,统计不

Gym - 100345H Settling the Universe Up(bitset)

https://vjudge.net/problem/Gym-100345H 题意: 给出一个图,求图中u能到达v的对数,并且u<v.并且会有更新和查询操作. 思路: bitset直接暴力,对于每次更新操作之后,再重新计算一遍即可.bitset是真的强大啊! 1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<ve

【动态规划】【滚动数组】【bitset】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem J. Terminal

有两辆车,容量都为K,有n(10w)个人被划分成m(2k)组,依次上车,每个人上车花一秒.每一组的人都要上同一辆车,一辆车的等待时间是其停留时间*其载的人数,问最小的两辆车的总等待时间. 是f(i,j)表示前i组,j个人是否可行.w(i)表示第i组的人数. if f(i,j)==1 then f(i+1,j+w(i+1))=1. 这是个bitset可以做的事情,每次左移以后或上f(i-1)的bitset即可.其实可以滚动数组. 然后每更新一次bitset,求一下其最左侧的1的位置,就是对于第一辆

洛谷 P3674 小清新人渣的本愿 [莫队 bitset]

传送门 题意: 给你一个序列a,长度为n,有Q次操作,每次询问一个区间是否可以选出两个数它们的差为x,或者询问一个区间是否可以选出两个数它们的和为x,或者询问一个区间是否可以选出两个数它们的乘积为x ,这三个操作分别为操作1,2,3 题面太强啦!!! 感觉就是莫队,想了一下分块不好搞更坚定了莫队的信念 $a-b=x$,$a=x+b$,放在权值数组上就是b右移x位,$bitset$大法好 加法同理 乘法,总共就$\sqrt{N}$个约数.... #include <iostream> #incl

C++ 之 bitset

在PC端文件播放器中,多画面管理时,将整个画面切割成N个矩形块.将打开显示与否的信息放在bitset容器中,今天就来对bitset做个小结 1.bitset可以表示二进制的有序集,用bitset来处理程序中的需要保存一组标志的操作很简便,下面总结一下bitset的一些函数. 2.定义和初始化bitset: 定义一个bitset时需要声明它包含多少个二进制位,大小必须是一个常量表达式,bitset中的二进制位是未命名的,可以通过位置来访问.编号从右到左依次从0位开始,从低到高. 例:bitset<

BZOJ3687:bitset STL

[bzoj3687][FJ2014集训]简单题 2014年9月14日1,8212 [题目描述]小呆开始研究集合论了,他提出了关于一个数集四个问题:1. 子集的异或和的算术和.2. 子集的异或和的异或和.3. 子集的算术和的算术和.4. 子集的算术和的异或和.目前为止,小呆已经解决了前三个问题,还剩下最后一个问题还没有解决,他决定把这个问题交给你,未来的集训队队员来实现.[输入格式]从 xor.in 中输入数据第一行,一个整数 n.第二行,n 个正整数,表示 a1, a2, …, an[输出格式]

#include &lt;bitset&gt;

1 none();测试是否有越位 2 reset();全部清零 3 set(7, 0);把第7个字符改成0,操作二进制位 4 to_string();转换为字符串 5 to_ulong();转换为无符号整数 bitset可以实现把十进制转换为二进制,以及输出补码 1 #include <iostream> 2 #include <bitset> 3 4 void main() 5 { 6 int num = -5; 7 8 std::bitset<32>myset(nu

Java BitSet使用场景和示例

一.什么是BitSet? 注:以下内容来自JDK API: BitSet类实现了一个按需增长的位向量.位Set的每一个组件都有一个boolean值.用非负的整数将BitSet的位编入索引.可以对每个编入索引的位进行测试.设置或者清除.通过逻辑与.逻辑或和逻辑异或操作,可以使用一个 BitSet修改另一个 BitSet的内容. 默认情况下,set 中所有位的初始值都是false. 每个位 set 都有一个当前大小,也就是该位 set 当前所用空间的位数.注意,这个大小与位 set 的实现有关,所以

Bzoj 1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名 传递闭包,bitset

1703: [Usaco2007 Mar]Ranking the Cows 奶牛排名 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 323  Solved: 238[Submit][Status][Discuss] Description 农夫约翰有N(1≤N≤1000)头奶牛,每一头奶牛都有一个确定的独一无二的正整数产奶率.约翰想要让这些奶牛按产奶率从高到低排序.    约翰已经比较了M(1≤M≤10000)对奶牛的产奶率,但他发现,他还需要再做一