STLのビットセット

著者MiserWeyte

前なのでロスバレー競馬20191109月、私は不慣れなビットセット、T3に直接つながった\(70の\ SIM 100 PTS \ RIGHTARROW 50pts \) ビットセットを確認します。


まず、概念

ビットセットを格納するビット。

したがって、それはビット集合にBOOL配列を認識することができるが、より速く、算術整数ビットとして直接ようにすることができるように、数1等を数えます。

第二に、宣言と初期化

変数nビット集合長さに渡さビット集合宣言:

#include <bitset>
bitset <n> b; // 全为0
bitset <n> b(u); // 从unsigned long型变量u复制而来
bitset <n> b(s); // 从string对象s复制而来
bitset <n> b(s, pos, m); // 从string对象s的[pos, pos+m]复制而来

いくつかの例をunsigned long型の初期化を使用します。

bitset<16> bitvec1(0xffff); // bits 0 ... 15 are set to 1
// bitvec2 same size as initializer
bitset<32> bitvec2(0xffff); // bits 0 ... 15 are set to 1; 16 ... 31 are 0
// on a 32-bit machine, bits 0 to 31 initialized from 0xffff
bitset<128> bitvec3(0xffff); // bits 32 through 127 initialized to zero

符号なしの長い文字列を使用して、または初期化したとき、元の型が初期位置ビットセットに対応するバイナリ形式でビットパターンに変換され、過剰のビット集合指定された長さを捨て。

第三に、操作

このセクションでは、翻訳からC ++のリファレンス

1.訪問

  • B [POS]:B、最初のアクセス位置pos

  • b.count():数をカウント1
  • b.size():ビットビット集合の数を返します
  • b.test(POS):[POS]の値Bを返し
  • b.any():すべてのテストがあります1
  • b.none():なしていることを確認していない1
  • b.all():試験は、図1(c ++ 11)であったか否か

2.変更

  • b.set(POS):1のように変更B [POS]
    • 着信POS場合、すべてのビットが1に変更します
  • b.reset(POS):0のように変更B [POS]
    • 着信POS場合、すべてのビットが0に変更します
  • b.flip(POS):B [POS]否定
    • 入ってくるPOS場合は、すべてのビットごとの否定します

3.変換

  • )(b.to_string:文字列の変換
  • b.to_ulong():unsigned long型に変換され、
  • b.to_ullongは():符号なしに変換されて、長い長い(C ++ 11)

4.出力

  • OS << B:Bは、ストリームのOSに出力され、
    • サンプル出力
bitset <16> b(0xff);
cout << b;
///////////////////////////////////////////////
//output:
//0000000011111111
///////////////////////////////////////////////

5.ビット演算

ビット集合オペレータサポートレベルは、基本的に、化粧品として扱います。

いくつかのためのC ++の参照サンプル

// bitset operators
#include <iostream>       // std::cout
#include <string>         // std::string
#include <bitset>         // std::bitset

int main ()
{
  std::bitset<4> foo (std::string("1001"));
  std::bitset<4> bar (std::string("0011"));

  std::cout << (foo^=bar) << '\n'; // 1010 (XOR,assign)
  std::cout << (foo&=bar) << '\n'; // 0010 (AND,assign)
  std::cout << (foo|=bar) << '\n'; // 0011 (OR,assign)

  std::cout << (foo<<=2) << '\n';  // 1100 (SHL,assign)
  std::cout << (foo>>=1) << '\n';  // 0110 (SHR,assign)

  std::cout << (~bar) << '\n';     // 1100 (NOT)
  std::cout << (bar<<1) << '\n';   // 0110 (SHL)
  std::cout << (bar>>1) << '\n';   // 0001 (SHR)

  std::cout << (foo==bar) << '\n'; // false (0110==0011)
  std::cout << (foo!=bar) << '\n'; // true  (0110!=0011)

  std::cout << (foo&bar) << '\n';  // 0010
  std::cout << (foo|bar) << '\n';  // 0111
  std::cout << (foo^bar) << '\n';  // 0101

  return 0;
}
///////////////////////////////////////////////////////
//output:
//1010
//0010
//0011
//1100
//0110
//1100
//0110
//0001
//0
//1
//0010
//0111
//0101
///////////////////////////////////////////////////////

おすすめ

転載: www.cnblogs.com/miserweyte/p/11831963.html