bitset用法

3 篇文章 0 订阅
2 篇文章 0 订阅

前言

一个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题来练一练手

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值