天天看點

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。不僅縮小了占用空間,并且有專門優化過的類型方法,提高效率,乃是提高空間和時間複雜度的利器。

初始化預設情況下所有的位都被初始化為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仍然占用一個位元組。

繼續閱讀