使用bitset需要引用<bitset>
头文件。
赋值
#include<bits/stdc++.h>
using namespace std;
bitset<8>s;
int main(){
string k="01110001";
bitset<8>s(k);
cout<<s;
return 0;
}
输出01110001
关于位怎么对应
移动
按位运算(按位 xor & |)
注意只有按位运算仅仅支持两个长度相同bitset类型的按位运算,并且返回值是一个bitset
成员函数
reset
bitset的清空操作为reset。将集合内元素全部置零:
s.reset();
set
set有两种用法,第一种是直接调用set不带参数,会将bitset内所有元素置1,另一种是set后加两个参数,分别是pos和val,意为将bitset中第pos个元素的值置为v。当v为true时可以省略不写。
s.reset();
s.set() //11111111
s.set(3,false) //11110111
s.set(3) //11111111
使用set进行单点修改的复杂度为 O(1)O(1) , 将所有元素修改的复杂度为 O(frac{n}{w})O(wn)
test
test有一个参数pos,返回一个bitset内第pos位的值。
s.reset();
s.set(7);
int k = s.test(7); // k is true
k = s.test(6); // k is false
test的时间复杂度为 O(1)O(1)
any
bitset有一个成员函数为any,返回一个布尔量。若bitset内部存在一位的值为1,则返回true,否则返回false:
s.clear();
bool k = s.any(); //k is false
s[1] = true;
k = s.any() //k is true
复杂度同上。按照不同编译器版本的实现方法,.any()的常数甚至有可能小于理论值。
none
与any相对,返回一个布尔量,不存在任何一个位置的值为1则返回true,否则返回false。
s.clear();
bool k = s.none(); //k is true
s[1] = true;
k = s.none() //k is false
count
count返回一个bitset内1的个数,是一个无符号整形:
s.reset();
int k = s.count(); // k is 0
s[1] = true;
k = s.count(); // k is 1
需要注意的是目前扶苏已知的资料中,count的复杂度也是 O(frac{N}{w})O(wN) 。
当然想知道0的个数可以用总长度减去count喽
flip
flip函数类似于按位取反,它的两个声明如下:
bitset& flip();
bitset& flip (size_t pos);
当调用s.flip()且括号内无参数时,会将集合内所有元素取反(0变1,1变0)
当调用s.flip(x)时,会将第x位取反(从0编号)
s.reset();
s[1] = true; //s is "01000000"
s.flip(); //s is "10111111"
s.flip(1); //s is "11111111"