bool 和 bitset的区别

Bool,vector<bool>与bitset<num>

1. bool类型变量在c++中占用1个字节.

Bool a[8];

Std::cout<<Sizeof(a);

输出结果为8,即占用了8个字节

2. bitset<NUM>,每个bool值占用一个bit,所以4字节大小能存储32bit。不仅缩小了占用空间,并且有专门优化过的类型方法,提高效率,乃是提高空间和时间复杂度的利器。

初始化缺省情况下所有的位都被初始化为

4种初始化方法

bitset<n> b;

b有n位,每位都为0

bitset<n> b(u);

b是unsigned long型u的一个副本

bitset<n> b(s);

b是string对象s中含有的位串的副本

bitset<n> b(s, pos, n);

b是s中从位置pos开始的n个位的副本

 biset基本用法:


初始化

bitset< 32 > bitvec2( 0xffff );//0xffff代表代表16进制的数字,转成2进制是16个1.

//将bitvec2 的低16 位设为1

//下面的bitvec3 的定义


bitset< 32 > bitvec3( 012 );

//将第1 和3 位的值设置为1 假设位置从0 开0

//因为 012 在c语言中表示八进制数字12即二进制数字“1010”

//我们还可以传递一个代表0 和1 的集合的字符串参数来构造bitset 对象如下所示

// 与bitvec3 的初始化等价


string bitval( "1010" );

bitset< 32 > bitvec4( bitval );

bitvec4 和bitvec3 的第1 和3 位都被设置为1 而其他位保持为0


bitvec.set();//全设为1

bitvec.reset();//全设为0

//count()操作返回被设置为1的位的个数.
int bits_set = bitvec.count();

当bitset对象的一位或多个位被设置为1 时any()返回true
bitset 对象的所有位都被设置为0 ,则none()操作返回true

 

bitvec.flip( 0 ); // 翻转第一位
bitvec[0].flip(); // 也是翻转第一位
bitvec.flip(); // 翻转所有的位的值

改变程序编译为64位后,内存地址指针的大小变为64位,bitset的最小占用仍为4字节没有变为8字节。

仍然是以最小为4字节大小存放32bit,接下来随着存放bit位增大,占用字节数往上乘2,貌似当字节数到达16后,后面突破存储上限字节数就增加8.

因此64位占用满8字节,65位和128位会开启16字节空间,256位占用32位,129位占用24,257位占用40.

 

//测试用code

#include<iostream>

#include<bitset>

std::bitset<1> bs;

std::bitset<32> bs32;

std::bitset<64> bs64;

std::bitset<65> bs65;

std::bitset<128> bs128;

std::bitset<129> bs129;

std::bitset<257> bs257;

bool a, a1[1], a2[8];

std::bitset< 32 >bitvec3(012);

int main(){

    std::cout << sizeof(a) <<std::endl;

    std::cout << sizeof(a1) <<std::endl;

    std::cout << sizeof(a2) <<std::endl;

    std::cout << sizeof(bs) <<std::endl;

    std::cout << sizeof(bs32) <<std::endl;

    std::cout << sizeof(bs64) <<std::endl;

    std::cout << sizeof(bs65) <<std::endl;

    std::cout << sizeof(bs129) <<std::endl;

    std::cout << sizeof(bs257) <<std::endl;

    for (int i = 0; i < 32; ++i){

         std::cout << bitvec3[i] ;

    }

    std::cout << std::endl <<bitvec3.count() << std::endl;

    bitvec3.set();

    for (int i = 0; i < 32; ++i){

         std::cout << bitvec3[i];

    }

    std::cout << std::endl;

    bitvec3.reset();

    for (int i = 0; i < 32; ++i){

         std::cout << bitvec3[i];

    }

    std::cout << std::endl;

    std::cout << &bs65;

}



 

3. vector<bool>

仅仅是利用了vector动态存储和各种内置方法的便利,一个bool仍然占用一个字节。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值