bitset

bitset是C++标准库中的一个非常有用的模板类,它提供了一种方便的方式来存储和操作固定大小的位序列。使用bitset,你可以执行位操作,如位的设置、复位、翻转,以及查询特定位的状态等,而不需要直接操作位运算符。这使得代码更加简洁、易读。

基本用法

要使用bitset,你需要包含头文件<bitset>。创建一个bitset时,你需要在尖括号中指定位的数量。例如,bitset<8>创建了一个可以存储8位的bitset

#include <bitset>
#include <iostream>

int main() {
    std::bitset<8> bits(0b11010010); // 从二进制数初始化
    //std::bitset<8> bits(8);//也可以用十进制初始化
    std::cout << bits << std::endl;
}

常用成员函数

set(): 将所有位设置为1,或者指定位置的位设置为1。

reset(): 将所有位设置为0,或者指定位置的位设置为0。

flip(): 翻转所有位的状态,或者翻转指定位置的位。

test(pos): 检查在pos位置的位是否为1。

count(): 返回bitset中设置为1的位的数量。

size(): 返回bitset中位的数量。

to_string(): 返回bitset的字符串表示,其中包含了'0''1'

to_ulong()to_ullong(): 将bitset转换为无符号长整型或无符号长长整型数值。注意,如果bitset太大,无法用一个unsigned longunsigned long long表示,则会抛出std::overflow_error异常。

示例:位操作

#include <bitset>
#include <iostream>

int main() {
    std::bitset<8> bits(0b10101010); // 初始化

    // 设置和重置位
    bits.set(1); // 将位置1的位设置为1
    bits.reset(2); // 将位置2的位设置为0
    std::cout << "After set and reset: " << bits << std::endl;

    // 翻转位
    bits.flip(); // 翻转所有位
    std::cout << "After flip: " << bits << std::endl;

    // 查询位
    if (bits.test(0)) { // 测试位置0的位是否为1
        std::cout << "Bit 0 is set." << std::endl;
    }

    // 统计设置为1的位数
    std::cout << "Number of bits set: " << bits.count() << std::endl;

    // 转换为字符串
    std::cout << "Bitset as string: " << bits.to_string() << std::endl;

    // 转换为数值
    std::cout << "Bitset as number: " << bits.to_ulong() << std::endl;
}

bitset提供了一种高效且易于使用的方式来处理位级操作,特别是当你需要操作的位数固定且相对较小时。它比手动使用位操作符更安全、更直观,而且能自动处理一些常见的错误情形,如索引越界。


⬅️ 2、明码 🏠 00-刷题理模型 ➡️ 3、乘积尾零