bitset 使用总结

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

申请

std::bitset<N> vis;

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

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

其中 val 是二进制形式,str01 串。

时间复杂度

O(nw),其中 w 是计算机的位数。

用法

  1. x<<=5;可以直接类似二进制左移或右移
  2. count(),返回 1 的数量
  3. test(x),查询 x 处是否有 1
  4. any()any()返回 1 表示存在一位为 1,返回 0 则反之
  5. none()all()none()是所有位为 0 返回 1,否则返回 0all则反之。
  6. set()set(pos,val=true)set是使所有位为 1set(po,val=true)是使某一位为 1
  7. reset()reset(pos)reset()是使所有位为 0reset(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 @   tyccyt  阅读(90)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
点击右上角即可分享
微信分享提示