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。不仅缩小了占用空间,并且有专门优化过的类型方法,提高效率,乃是提高空间和时间复杂度的利器。
初始化缺省情况下所有的位都被初始化为0 。
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仍然占用一个字节。