C++ 標準ライブラリ<bitset>

C++ プログラミングでは、<bitset>標準ライブラリの一部であり、固定サイズのビット集合を操作する方法を提供します。

ビット集合はビット(bit)からなる配列で、各ビットは 0 または 1 を取ります。

<bitset>バイナリデータを効率的に保存・操作する方法を提供し、ビットレベルの操作が必要な場面(フラグ管理、ビットマスク操作など)に特に適しています。

bitsetはテンプレートクラスであり、そのテンプレートパラメータがビット集合のサイズを定義します。例えば、bitset<32>32ビットを含むビット集合を表します。

構文

以下は使用bitsetの基本構文:

#include <bitset>

// 声明一个大小为N的bitset
std::bitset<N> b;

// 初始化bitset
b = std::bitset<N>(value);

// 访问位集合中的单个位
bool bit = b[i];

std::bitset の基本用法

std::bitset はテンプレートクラスで、固定サイズの2進ビット列を表します。そのテンプレートパラメータはビット数(N)で、2進列の長さを表します。

std::bitset の定義:

std::bitset<8> bits;  // 定义一个 8 位的二进制序列

std::bitset の初期化:

  • デフォルト初期化:すべてのビットは0。

  • 整数からの初期化:整数を2進数に変換します。

  • 文字列からの初期化:文字列を2進数として解析します。

例

std::bitset<8> bits1;               // デフォルト初期化:00000000
std::bitset<8> bits2(42);           // 整数からの初期化:00101010
std::bitset<8> bits3("10101010");   // 文字列からの初期化:10101010

よく使うメンバ関数

std::bitset は、ビットを操作するための豊富なメンバ関数を提供します。

ビットのアクセスと変更:

  • operator[]:特定のビットにアクセスまたは変更します。

  • set():特定のビットまたはすべてのビットを1。

  • reset():特定のビットまたはすべてのビットを0。

  • flip():特定のビットまたはすべてのビットを反転します。

例

std::bitset<8> bits("00001111");
bits[0] = 1;          // ビット 0 を変更:00001111 -> 00001111
bits.set(4);          // ビット 4 をセット:00001111 -> 00011111
bits.reset(1);        // ビット 1 をリセット:00011111 -> 00011101
bits.flip();          // すべてのビットを反転:00011101 -> 11100010

ビット情報の照会:

  • count():返します1の個数。

  • size():ビット数を返します。

  • test(pos):特定のビットが1。

  • all():すべてのビットが1。

  • any():いずれかのビットが1。

  • none():すべてのビットが0。

例

std::bitset<8> bits("10101010");
std::cout << "Count of 1s: " << bits.count() << std::endl;  // 出力 4
std::cout << "Size: " << bits.size() << std::endl;          // 出力 8
std::cout << "Is bit 3 set? " << bits.test(3) << std::endl; // 出力 1 (true)
std::cout << "All bits set? " << bits.all() << std::endl;   // 出力 0 (false)

他の型への変換:

  • to_ulong():をstd::bitset変換しますunsigned long。

  • to_ullong():std::bitset:をunsigned long long。

  • to_string()変換しますstd::bitset文字列に変換します。

例

std::bitset<8> bits("10101010");
unsigned long num = bits.to_ulong();  // 整数に変換:170
std::string str = bits.to_string();   // 文字列に変換:"10101010"

ビット操作

std::bitset は、ビットごとの AND、OR、XOR、NOT などの一般的なビット操作をサポートしています。

  • &:ビットごとの AND

  • |:ビットごとの OR

  • ^:ビットごとの XOR

  • ~:ビットごとの NOT

例

std::bitset<8> bits1("10101010");
std::bitset<8> bits2("11110000");

std::bitset<8> result_and = bits1 & bits2;  // ビットごとの AND:10100000
std::bitset<8> result_or = bits1 | bits2;   // ビットごとの OR:11111010
std::bitset<8> result_xor = bits1 ^ bits2;  // ビットごとの XOR:01011010
std::bitset<8> result_not = ~bits1;         // ビットごとの NOT:01010101

例

基本的な使い方:

例

#include <iostream>
#include <bitset>

int main() {
    std::bitset<8> b("11001010"); // 文字列から初期化
    std::cout << "Initial bitset: " << b << std::endl;

    // 特定の位置のビットにアクセス
    std::cout << "Bit at position 3: " << b[3] << std::endl;

    // ビットを変更
    b[3] = 1;
    std::cout << "Modified bitset: " << b << std::endl;

    // ビットを反転
    b.flip();
    std::cout << "Flipped bitset: " << b << std::endl;

    return 0;
}

出力結果:

Initial bitset: 11001010
Bit at position 3: 0
Modified bitset: 11001011
Flipped bitset: 00110110

ビット操作:

例

#include <iostream>
#include <bitset>

int main() {
    std::bitset<8> b1("10101010");
    std::bitset<8> b2("11110000");

    // ビット AND 操作
    std::bitset<8> b_and = b1 & b2;
    std::cout << "Bitwise AND: " << b_and << std::endl;

    // ビット OR 操作
    std::bitset<8> b_or = b1 | b2;
    std::cout << "Bitwise OR: " << b_or << std::endl;

    // ビット XOR 操作
    std::bitset<8> b_xor = b1 ^ b2;
    std::cout << "Bitwise XOR: " << b_xor << std::endl;

    // ビット NOT 操作
    std::bitset<8> b_not = ~b1;
    std::cout << "Bitwise NOT: " << b_not << std::endl;

    return 0;
}

出力結果:

Bitwise AND: 10100000
Bitwise OR: 11111010
Bitwise XOR: 01111010
Bitwise NOT: 01010101

ビット集合のループ走査:

例

#include <iostream>
#include <bitset>

int main() {
    std::bitset<8> b("10101010");

    // bitset 内のビットをループ走査
    for (size_t i = 0; i < b.size(); ++i) {
        std::cout << b[i];
    }
    std::cout << std::endl;

    return 0;
}

出力結果:

10101010

bitsetは C++ 標準ライブラリの中でも非常に便利なツールであり、プログラマが直感的かつ効率的にビットレベルのデータを扱うことを可能にします。上記の例を通して、宣言、初期化、アクセス、変更、ビット操作の方法を確認できます。これらの機能は、バイナリデータを扱う場合やビットレベルの制御が必要な場面で非常に役立ちます。

注意事項

  • std::bitsetのサイズは固定されており、コンパイル時に決定されます。

  • ビット数がunsigned long 或 unsigned long longのビット数を超えると、to_ulong()とto_ullong()スローしますstd::overflow_error例外。

  • std::bitsetサイズの動的調整はサポートされていません。動的なビット集合が必要な場合は、次を検討できます。std::vector<bool>。

その他の拡張