bitset 使用总结

本文为 OI-Wiki 与 扶苏的bitset浅谈 的整合

申请

std::bitset<N> vis;

其中 N 指这个 vis 的空间大小。

同时,还可以设初值(bitset<unsigned long val>bitset<const string& str>

其中 val 是二进制形式,str\(01\) 串。

时间复杂度

\(O(\frac{n}{w})\),其中 \(w\) 是计算机的位数。

用法

  1. x<<=5;可以直接类似二进制左移或右移
  2. count(),返回 \(1\) 的数量
  3. test(x),查询 \(x\) 处是否有 \(1\)
  4. any()any()返回 \(1\) 表示存在一位为 \(1\),返回 \(0\) 则反之
  5. none()all()none()是所有位为 \(0\) 返回 \(1\),否则返回 \(0\)all则反之。
  6. set()set(pos,val=true)set是使所有位为 \(1\)set(po,val=true)是使某一位为 \(1\)
  7. reset()reset(pos)reset()是使所有位为 \(0\)reset(pos)是使某一位为 \(0\)
  8. flip()flip(pos)flip()是翻转所有位,flip(pos)是翻转某一位。

代码实现以及测试

#include <bits/stdc++.h>
using namespace std;
const int n=10000000;
//以下为定义 bitset 
bitset<10000005>vis;
/*
也可以初始化:
bitset<N>s(string("00110101"))   ······
*/
int main()
{
	//freopen("1.in","r",stdin);
	//freopen("1.out","w",stdout); 
	//-----------------------------
	srand(time(0));
	for(int i=1;i<=n;i++)
	{
		int x=rand()%n+1;
		vis[x]=1;
	}
	//以上为使某一位为 1 
	//-----------------------------
	for(int i=1;i<=n;i++)
	{
		int f=vis.test(i);
	}
	//以上为 test 用法 
	//-----------------------------
	bool t=vis.none();
	bool tt=vis.all();
	//以上为 none 与 all 的用法 
	//-----------------------------
	vis.set();
	vis.reset();
	for(int i=1;i<=n;i++)
	{
		if(i&1)vis.set(i);
		else vis.reset(i);
	}
	//以上为 set 以及 reset 用法
	//----------------------------- 
	for(int i=1;i<=n;i++)
	{
		if(i&1)vis.flip(i);
	}
	vis.flip();
	//以上为  flip 用法 
	return 0;
}

上面代码在 lemon 上的运行时间:

img

posted @ 2024-11-01 20:02  tyccyt  阅读(13)  评论(0编辑  收藏  举报