Bitset用法简单介绍

本文详细介绍了 C++ STL 中 Bitset 的基本用法,包括构造函数、成员函数及操作符重载等。通过实例展示了如何使用 Bitset 进行位运算,适用于存储状态、模拟行动和搜索等问题。

C++/STL Bitset (转)

最近用的bitset比较多,位运算在存储状态、模拟行动、搜索很多方面有着非常巨大的优势,所以特意转了一篇bitset的基本用法。

==========================================================

构造函数
bitset<n> b;
 b有n位,每位都为0.参数n可以为一个表达式.
如bitset<5> b0;则"b0"为"00000";
 
bitset<n> b(unsigned long u);
 b有n位,并用u赋值;如果u超过n位,则顶端被截除
如:bitset<5>b0(5);则"b0"为"00101";
 
bitset<n> b(string s);
 b是string对象s中含有的位串的副本
string bitval ( "10011" );
bitset<5> b0 ( bitval4 );
则"b0"为"10011";

 
bitset<n> b(s, pos);
 b是s中从位置pos开始位的副本,前面的多余位自动填充0;
string bitval ("01011010");
bitset<10> b0 ( bitval5, 3 );
则"b0" 为 "0000011010";
 
bitset<n> b(s, pos, num);
 b是s中从位置pos开始的num个位的副本,如果num<n,则前面的空位自动填充0;
string bitval ("11110011011");
bitset<6> b0 ( bitval5, 3, 6 );
则"b0" 为 "100110";


os << b
 把b中的位集输出到os流
os >>b
输入到b中,如"cin>>b",如果输入的不是0或1的字符,只取该字符前面的二进制位.

bool any( ) 
 是否存在置为1的二进制位?和none()相反
 
bool none( ) 
是否不存在置为1的二进制位,即全部为0?和any()相反.
 
size_t count( )
二进制位为1的个数.
 
size_t size( )
 二进制位的个数

flip()
 把所有二进制位逐位取反
 
flip(size_t pos)
 把在pos处的二进制位取反
 
bool operator[](   size_type _Pos )
 获取在pos处的二进制位
 
set()
 把所有二进制位都置为1
 
set(pos)
 把在pos处的二进制位置为1
 
reset()
 把所有二进制位都置为0
 
reset(pos)
 把在pos处的二进制位置为0

test(size_t pos)
在pos处的二进制位是否为1?

unsigned long to_ulong( )
 用同样的二进制位返回一个unsigned long值

string to_string ()
返回对应的字符串.

1
0
« 上一篇: POJ 3652 Persistent Bits (模拟)
» 下一篇: POJ 1652 Holey Cloth (bfs)

posted on 2010-04-10 10:54 Lvpengms 阅读(11230) 评论(0) 编辑 收藏

<think>好的,我现在要介绍一下`bitset`。嗯,首先,用户可能想了解`bitset`是什么,以及它在编程中的作用。`bitset`是C++标准库中的一个类,对吧?它用来处理二进制位的集合。我记得它的主要优点是能够高效地存储和操作位级别的数据,比如标志位或者位掩码。不过具体怎么用呢?可能需要详细说明一下它的基本用法,比如如何初始化、设位、重位等等。 接下来,用户可能需要知道`bitset`的优势在哪里。比如,相比于使用整数或者数组来管理位,`bitset`在空间和时间效率上的表现更好。因为它直接利用位操作,节省内存,而且操作速度更快。比如,处理大量布尔值时,用`bool`数组每个元素占一个字节,而`bitset`每个元素只占一个位,节省了八倍的空间。 然后,可能需要举一些实际的应用场景,比如状态压缩、位掩码操作、布隆过滤器或者位图算法。这些例子能帮助用户理解什么时候该使用`bitset`。比如在算法竞赛中,状态压缩常用`bitset`来优化空间和时间。 不过,用户可能也会想知道`bitset`的局限性。比如,`bitset`的大小在编译时就需要确定,不能动态调整,这在某些需要动态分配的情况下可能不够灵活。这时候可能需要用`vector<bool>`或者其他数据结构来代替,但要注意`vector<bool>`其实并不是标准的容器,可能存在一些陷阱。 另外,`bitset`提供的一些成员函数,比如`set()`, `reset()`, `flip()`, `test()`等,需要具体解释每个函数的作用和用法。还有位操作符的重载,比如与、或、异或等,这些操作可以方便地进行位运算,但需要确保两个`bitset`的长度相同。 可能还需要提到一些高级功能,比如转换函数,将`bitset`转换为字符串或者整数,这在输出或者与其他数据交互时很有用。比如用`to_string()`方法可以得到二进制字符串,用`to_ulong()`或`to_ullong()`转换成无符号长整数,但要注意溢出问题。 同时,要注意错误处理。比如,当访问超出范围的位时,`bitset`的`test()`方法会抛出异常,而直接使用`operator[]`则不会检查边界,可能导致未定义行为。这点需要提醒用户注意,确保安全访问。 最后,可能需要给一个简单的代码示例,展示如何声明、初始化和操作`bitset`,让用户更直观地理解其用法。比如,创建一个8位的`bitset`,设某些位,然后进行移位操作或者统计位数量。 总结起来,介绍`bitset`需要涵盖定义、基本操作、优势、应用场景、局限性以及注意事项,配合示例代码帮助用户理解。同时要确保语言清晰,结构合理,逐步引导用户从概念到实际应用。</think>`bitset` 是 C++ 标准库中提供的一个类模板,用于高效管理固定长度的二进制位序列。以下是其核心要点和用法: --- ### **1. 基本概念** - **作用**:以布尔值(0/1)形式存储和操作固定长度的二进制位,支持高效的位运算。 - **特点**: - **编译时确定大小**:模板参数指定位数(如 `bitset<8>` 表示 8 位)。 - **内存高效**:每个位仅占 1 bit 空间(对比 `bool` 数组的 1 byte/位)。 - **直接位操作**:支持与、或、异或等位运算。 --- ### **2. 基本操作** #### **初始化** ```cpp bitset<8> b1; // 默认全0: 00000000 bitset<8> b2(0xFA); // 十六进制初始化: 11111010 bitset<8> b3("101010");// 字符串初始化: 00101010(右侧对齐) ``` #### **位操作** ```cpp b.set(3); // 将第3位设为1(从右到左,下标0开始) b.reset(2); // 将第2位设为0 b.flip(); // 所有位取反 b.test(1); // 检查第1位是否为1(返回 bool) b.count(); // 统计1的个数 b.size(); // 返回总位数(编译时确定) ``` #### **位运算** ```cpp bitset<4> a("1010"), b("0110"); a & b; // 按位与: 0010 a | b; // 按位或: 1110 a ^ b; // 按位异或: 1100 a << 2; // 左移2位: 1000(高位丢弃,低位补0) ``` --- ### **3. 应用场景** - **状态压缩**:将多个布尔状态合并为整数,节省空间(如动态规划优化)。 - **位掩码**:快速管理权限标志或开关状态。 - **布隆过滤器**:利用多个哈希位标记元素存在性。 - **位图算法**:高效处理海量数据的去重或统计。 --- ### **4. 优势与局限** - **优势**: - 内存占用极低(1 bit/位)。 - 位运算直接由硬件指令支持,效率高。 - **局限**: - 大小需编译时确定,无法动态调整。 - 超出范围的位访问可能引发异常(如 `test()` 会检查边界)。 --- ### **5. 示例代码** ```cpp #include <bitset> #include <iostream> int main() { std::bitset<8> bits("1100"); bits.set(0); // 变为 11000001 bits.flip(3); // 第3位取反 → 11001001 std::cout << bits.to_string() << std::endl; // 输出 "11001001" std::cout << "1的个数: " << bits.count(); // 输出 4 return 0; } ``` --- ### **6. 注意事项** - **转换限制**:`to_ulong()` 和 `to_ullong()` 需确保值不超过目标类型的范围。 - **动态需求**:需动态调整大小时,可改用 `vector<bool>`(注意其潜在实现差异)或第三方库(如 `boost::dynamic_bitset`)。 `bitset` 是处理固定位集合的理想工具,尤其适合对性能和内存有严格要求的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值