标准库 bitset

作用

  有些程序要处理二进制的有序集,每个位都可能包含0和1值。位是用来保存一组项或条件的yes/no信息(有时也称标志)的简洁方法。标准库提供的bitset类简化了位集的处理。

声明

  #include<bitset>

  using namesapce std;

bitset类对象的定义和初始化

  类似于vector,bieset类是一种类模板;而与vector不一样的是bitset类型对象的区别在于其长度而不在于其类型。在定义bitset时,要明确bitset有多少位,须在尖括号内给出它的长度值:

                                                       初始化bitset类的方法

                                        

用unsigned 值初始化bitset对象

  当用unsigned long 值作为bitset对象的初始值时,该值将自动转化为二进制的位模式。例:bitset<32> n(15) 。

如果bitset类长度大于unsigned long 值的二进制位数,则其余的高阶位将置为0;如果长度小于 unsigned long 值的二进制位数,则只使用unsigned 值中的低阶位,超过bitset 类型长度的高阶位将被丢弃。

用 string 对象初始化 bitset 对象

   当用 string 对象初始化 bitset 对象时,string 对象直接表示为位模式。从 string 对象读入位集的顺序是从右向左:

string strval("1100");

bitset<32> bitvec(strval);

bitset位模式中第2和第3的位置为1,其余位置为0。

string 对象和 bitset 对象之间是反向转化的:string 对象的最右边字符(即下标最大的那个字符)用来初始化bitset 对象的低阶位(即下标为0的位)。

不一定要把整个string 对象都作为bitset 对象的初始值。相反,可以只用某个子串作为初始值:

string str("1111111000000011001101");

bitset<32> bitvec(str,5,4); //这里用str从str[5]开始包含的四个子符的子串来初始化 bitvec。

botset<32> bitvec(str,str.size()-4); //取出str末尾的四位来对bitvec的低四位进行初始化,其余为初始化为0。

bitset对象上的操作

#include <bitset>
#include <iostream>
using namespace std;
int main()
{
	// n有4位且每位都为0 
	bitset<4> n;
	cout << n << endl;
	
	// b有8位,将15转为2进制对b初始化 
	bitset<8> n(15);
	cout << n << endl;
	
	// 有位被设置为1则返回为真,否则返回为假 
	cout << n.any() << endl; 
	
	// n中被设置为1的位的个数 
	cout << n.count() << endl; 
	
	// 反置 0->1   1->0 
	cout << n.flip() << endl; 
	
	// 反置某一位置   从低位开始 
	cout << n.flip(5) << endl; 	
	
	// 重置全为0 (也可指定位置)
	cout << n.reset() << endl; 
	
	// 全部置为1 
	cout << n.set() << endl;
	 
	// n能容纳的位 
	cout << n.size() << endl;
	
	// 函数返回在pos上的位的值
	cout << n.test(2) << endl; 
	
	// 函数返回bitset的字符串形式
	cout << n.to_string() << endl;
	
	// 返回bitset的无符号长整数形式
	// 转化为10进制 
	cout << n.to_ulong() << endl;
	return 0;
} 

                                                                                                                                 摘自《C++primer》

`bitset` 是 C++ 标准库中的一个模板,它位于 `<bitset>` 头文件中,用于处理固定大小的位集合。`bitset` 通过无符号整数型存储位集合,并且提供了多种成员函数来操作这些位。它可以存储一个已知数量的位,并且每个位都可以设置为 0 或 1,非常适用于需要大量位操作的应用,比如位图、哈希表和其他需要紧凑存储的场景。 `bitset` 模板的声明如下: ```cpp template <size_t N> class bitset; ``` 这里 `N` 是一个编译时常量,指定了 `bitset` 对象中位的数量。 `bitset` 提供的操作包括: - 初始化:可以通过字符串、整数或使用默认构造函数来创建 `bitset`。 - 位操作:包括设置(set)、清除(reset)、翻转(flip)和检查(test)单个或全部位。 - 访问操作:可以直接访问特定的位或遍历所有位。 - 逻辑运算:支持与(&)、或(|)、非(~)、异或(^)和移动运算符。 - 输入输出:可以使用流运算符 `<<` 和 `>>` 进行输入输出操作。 `bitset` 的使用示例: ```cpp #include <bitset> #include <iostream> int main() { std::bitset<8> b(12); // 12的二进制表示是1100 std::cout << "The bitset contains " << b << std::endl; // 设置第1个位(从0开始计数) b.set(1); std::cout << "After setting the second bit: " << b << std::endl; // 清除第3个位 b.reset(2); std::cout << "After resetting the third bit: " << b << std::endl; // 翻转第1个位 b.flip(1); std::cout << "After flipping the second bit: " << b << std::endl; // 检查第0个位是否为1 std::cout << "Is the first bit set? " << b.test(0) << std::endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值