std::bitset

-----
#contents
-----

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

 #include <bitset>

***使用例 [#cacbb0a1]
#code(C){{
#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;
}
}}

***オペレータ [#u7fa1e1b]
- ==,!= : bitset同士の比較
- &=,^=,|=,~ : 論理和,排他的論理和,論理積,否定
- <<,>>,<<=,>>= : シフト演算

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS