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仍然占用一個位元組。