C++bitset学习笔记(超级简化)

使用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"
原文地址:https://www.cnblogs.com/xiazai/p/10356656.html