A、ビットセットの概要
- ビット集合クラスライブラリ定義するビット操作が使いやすい整数型の組の最大ビットサイズよりも、さらに処理することができます
- ビット集合は、で定義されているビット集合内のヘッダファイル
第二に、定義と初期化ビットセット
- 図は、ビットセットの構成方法を示してい
- LowとHigh:
- バイナリセット開始位置(インデックス0)がローと呼ばれ、その後のハイと称します
- 注、右端から始まるビットセットインデックス0
- ビットセットクラスは、配列型に似てテンプレート、ある固定されたサイズを有し、サイズが一定の式でなければなりません。我々はビットセットを定義するとき、我々はする必要があり、それが含まれているどのように多くのビットを宣言します。
std::bitset<32> bitvec(1U); //U占32位。因此bitvec为32位;低位为1,其他位均为0
初期化ビットセットと符号なしの値
- 我々が使用するときにビットセットを初期化するために時間積分値を、この値は符号なしlong longに変換され、タイプ、ビットパターンとして扱われます
- 次のようにルールは以下のとおりです。
- ビット集合のサイズが場合よりも大きい長い長い符号なしのビット数、残りの上位ビットは0に設定されています
- ビット集合のサイズ場合よりも小さい長い長い符号なしのビット数は、唯一与えられたステータス値を使用して、上側廃棄ビット集合のサイズを超え
- 例えば:
//0xbeef为:1011 1110 1110 1111 //bitvec1比初始值小。高位被丢弃 std::bitset<13> bitvec1(0xbeef); //二进制位序列为1 1110 1110 1111 //bitvec1比初始值大。高位被置位0 std::bitset<20> bitvec2(0xbeef); //进制位序列为0000 1011 1110 1110 1111 //在64位机器上,long long 0ULL是64位的,因此~0ULL是64个1 std::bitset<128> bitvec3(~0ULL); //0~63位为1,63~127位为0 std::cout << "bitvec1: " << bitvec1 << std::endl; std::cout << "bitvec2: " << bitvec2 << std::endl; std::cout << "bitvec3: " << bitvec3 << std::endl;
文字列の初期化からビットセット
- 私たちは、からできる文字列または文字配列ポインタビットセットを初期化します
- 注(キー):文字列で表される数値を使用する場合、最小の高い標準文字に対応する文字列には、添え字文字が最大ローに対応します
- 例えば:
std::bitset<32> bitvec4("1100"); //1100 std::cout << "bitvec4 : " << bitvec4 << std::endl;
- また、ビットセットを初期化するために、サブ文字列を使用することができます。例えば:
std::string str("1111111000000011001101"); std::bitset<32> bitvec5(str, 5, 4); //1100 std::bitset<32> bitvec6(str, str.size() - 4); //1101 std::cout << "bitvec5 : " << bitvec5 << std::endl; std::cout << "bitvec6 : " << bitvec6 << std::endl;
三、ビットセットの操作
- 操作は、大きく分けて2つのカテゴリに分け:
- リターン情報ビットセットの一種。たとえば数については、サイズ、すべての、任意の、なし、など
- 別のクラスには、ビットセットを設定します。例えば、セット、リセット、フリップ。これらの機能は、オーバーロードされます
- 例えば:
std::bitset<32> bitVec(1U); //32位,低位为1,剩余位为0
bool is_set = bitVec.any(); //true,因为有1被置位
bool is_not_set = bitVec.none(); //false,因为有1被置位
bool all_set = bitVec.all(); //false,因为有1被置位
size_t onBits = bitVec.count(); //返回1
size_t sz = bitVec.size(); //返回31
bitVec.flip(); //反转bitvec中的所有位
bitVec.reset(); //将所有位复位
bitVec.set(); //将所有位复位
- フリップのメンバー、セット、リセット及び試験はビットを読み書きするために私達を可能にする場所を指定し、例えば:
std::bitset<32> bitVec(1U); //32位,低位为1,剩余位为0
int i = 5;
bitVec.flip(0); //翻转第1位
bitVec.set(bitVec.size() - 1); //置位第1位
bitVec.set(0, 0); //复位第1位
bitVec.reset(i); //复位第i位
bitVec.test(0); //返回false,因为第1位是复位的
- 属性をリロードへのconst添字演算子:
- ビットが1の場合BOOLは、trueを返す位置に添字オペレータ復帰の値の定数バージョン、0 falaseこのビット戻ります
- 非constバージョンは、ビットセットを定義した特殊な型を返す私たちは、指定されたビットの値を操作することができます
std::bitset<32> bitVec(1U); //32位,低位为1,剩余位为0
bitVec[0] = 0; //将第1位复位
bitVec[31] = bitVec[0]; //将最后一位设置为与第1位一样
bitVec[0].flip(); //翻转第1位
~bitVec[0]; //等价操作,也是翻转第1位
bool b = bitVec[0]; //将bitVec[0]的值转换为bool类型
ビットセットは、(to_ulong、to_ullong)の値を抽出し
- to_ulong to_ullong操作と値を返す同じビットパターンビットセットと、格納されたオブジェクトを
- 場合にのみ、ビット集合の大きさ<=対応するサイズ(unsigned long型としてto_ulong、長い長い符号なしとしてto_ullong)、これら2つの操作を使用するために
- 例えば:
//在64位机器上,long long 0ULL是64位的,因此~0ULL是64个1 std::bitset<128> bitvec3(~0ULL); //0~63位为1,63~127位为0 unsigned long ulong = bitvec3.to_ulong(); std::cout << "ulong = " << ulong << std::endl;
- 以下のような手順上記の動作の結果は次のとおりです。
オペレータIOビットセット
- オペレータ入力(>>):
- 入力文字列から読み出されたストリームは、一時オブジェクトに保存されます
- 文字の数は、対応するサイズビットセット到達を読み取る、または文字が発生されなくなるまでときに1または0、またはファイルまたは入力エラーの端部は、読み出し処理が停止されます
- 読み込みプロセスがすぐにビットセットを初期化するために、一時的な文字列オブジェクトを使用した後
- 文字の数がいつものように、ビット集合のサイズよりも小さい読めば、高ビットが0に設定されています
- 出力演算子(<<):
- ビットセットオブジェクトのビットパターンを印刷
- 例えば:
std::bitset<16> bits; std::cin >> bits; std::cout << "bits: " << bits << std::endl;
ケース・プレゼンテーション
- 今、私たちはプログラムを持っている:30クラスの生徒、学生の行為に教師毎週検査、テスト結果と2で割っていないがあるとします。あなたの代わりに、学生のあらゆるを使用することができるように、我々は、少なくとも32の任意のマシン上のunsigned long、unsigned long型を表すために使用されます
- ここでは、この機能を完了するために、最も一般的なビット演算で始まります
bool status; unsigned long quizA = 0; //此值被当作位集合使用 quizA |= 1UL << 27; //指出第27个学生通过了检测 status = quizA&(1UL << 27); //检查第27个学生示范通过了检测 quizA &= ~(1UL << 27); //第27个学生为通过检测
- 私たちは、上記と同じ作業ビットセットを行うために使用しました
bool status; std::bitset<30> quizB; //每个学生分配一位,所有位初始化为0 quizB.set(27); ///指出第27个学生通过了检测 status = quizB[27]; //检查第27个学生示范通过了检测 quizB.reset(04); //第27个学生为通过检测