std::bitset



bitset

複数のbool型を連ねたようなもの.たくさんのフラグを格納するのに便利. また,bool型は2値しかとらないのに1バイト領域を必要とし,メモリの無駄となる. bitsetを使うことでメモリの節約にもなる.

#include <bitset>

使用例

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
#include <cstdio>
#include <string>
#include <bitset>
using namespace std;
 
enum Draw
{
    ID_DISPLAY_FLUID = 0, 
    ID_DISPLAY_RIGID, 
    ID_DISPLAY_CELLS, 
    ID_DISPLAY_BC, 
    ID_DISPLAY_NORMAL, 
    ID_DISPLAY_VELOCITY, 
};
 
std::bitset<8> g_bsDraw;    //!< 描画フラグ(大きさ8)
std::bitset<8> g_bsDraw2((string)"00101001");    //!< コンストラクタ引数あり1
std::bitset<8> g_bsDraw3((unsigned long)0xFF);    //!< コンストラクタ引数あり2
 
int main(void)
{
    g_bsDraw.reset();    // 全要素を0
    
    // フラグをセット
    g_bsDraw.set(ID_DISPLAY_FLUID, 1);
    g_bsDraw.set(ID_DISPLAY_BC, 1);
    g_bsDraw.set(ID_DISPLAY_VELOCITY, 1);
    
    // フラグを反転
    g_bsDraw.flip(ID_DISPLAY_NORMAL);
    
    // 全フラグを反転
    g_bsDraw.flip();
 
    // 要素参照(g_bsDraw.testでも可),無効な要素参照時はout_of_range例外が投げられる
    if(g_bsDraw.at(ID_DISPLAY_NORMAL)){
        printf("normal on\n");
    }
    else{
        printf("normal off\n");
    }
    
    // 例外なし要素参照
    if(g_bsDraw[ID_DISPLAY_NORMAL]){
        printf("normal on\n");
    }
    else{
        printf("normal off\n");
    }
 
    // 内容を文字列で取得("11000110"など)
    printf("bitset : %s\n", g_bsDraw.to_string().c_str());
 
    // 内容をunsigned longで取得
    printf("bitset : %d\n", g_bsDraw.to_ulong());
 
    // true要素の数, 全要素数
    printf("true : %d / %d\n", g_bsDraw.count(), g_bsDraw.size());
 
    // 全要素をtrueにする
    g_bsDraw.set();
 
    // 全要素をfalseにする
    g_bsDraw.reset();
 
    // 全要素が0ならfalseを返す
    if(!g_bsDraw.any()) printf("all false\n");
 
    // 全要素が0ならtrueを返す
    if(g_bsDraw.none()) printf("all false\n");
 
    return 0;
}

オペレータ

  • ==,!= : bitset同士の比較
  • &=,^=,|=,~ : 論理和,排他的論理和,論理積,否定
  • <<,>>,<<=,>>= : シフト演算

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2011-10-27 (木) 15:09:17