前言
一个bool耗内存多少,1BIT(位)?
根据其定义是这样的,可是在c++中,一个变量至少占1Bytes(字节),所以只用到1BIT的bool成功变成了1Bytes,要知道1Bytes=8BIT,那岂不是很浪费?
一般情况下,我们都使用整型变量压位的方式,但是当需要位数比较多的时候就会相对比较麻烦,那么怎么办呢,有个STL叫bitset,用它就能比较方便的进行压位。
介绍
头文件
使用bitset需要声明头文件
#include<bitset>
和
using namespace std;
声明
bitset的声明需要实现定好位置(如果要动态使用那请使用vector< bool >),一般可以以bitset< x >a的形式什么,x为bitset的二进制位数
bitset<5>x; //00000一般赋值,初始值为0
bitset<5>x=5; //00101直接用整数赋值,多余位会被删掉
bitset<5>x(std::string("101")); //00101用string来赋值
普通运算符
为啥bitset好用呢?那是因为它能支持所有的位运算
包括:
a=a|b; //或运算
a=a&b; //与运算
a=a^b; //异或运算
a=~a; //按位取反
a=a<<5; //左移
a=a>>5; //右移
请注意!!!除了左移右移的位数,其它位运算必须要在bitset间使用
运算函数
作为一名合格的STL,bitset也有着自己的函数
b.any( ) //b 中是否存在值为 1 的二进制位
b.none( ) //b 中是否不存在值为 1 的二进制位
b.set() //对 b 中全部元素赋为 1
b.set(pos) //处于 pos 位置的元素赋为 1
b.reset() //对 b 中全部元素赋为 0
b.reset(pos) //处于 pos 位置的元素赋为 0
b.set(pos, value) //处于 pos 位置的元素赋为 value
b.to_string() //返回将 b 转化为string的结果
b.to_ulong() //返回将 b 转化为unsigned int的结果
b.count() //返回二进制为 1 的元素个数
b.size() //返回二进制位的个数
b.flip() //所有二进制位按位取反
b.flip(pos) //处于 pos 位置的元素取反
b.test(pos) //返回处于 pos 位置的元素是否为1
当然,他也支持[]运算符
b[pos] //访问第pos位的元素,注意,bitset的位从0开始
其它
bitset的位运算复杂度是n/T向上取整,T视评测机而定,32位或64位,效果显著
在不开O2情况下优化幅度有损失,可以选择手写bitset(即手写class,通过unsigned long long压64位)
非常好用!
了解完大致的用法后可以做一些bitset题来练一练手