C++之bitset

本文介绍了C++标准库中的bitset类,用于方便地进行位运算和处理大容量二进制集合。bitset是一个类模板,需指定二进制位的数量,如bitset<32>。它可以使用整形值或字符串初始化,并提供了count、size、all、any和none等状态检查操作。此外,可以使用to_ulong和to_ullong提取位模式,但要注意溢出异常。通过cin可以从键盘读取bitset的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

标准库定义了 bitset 类,使得位运算的使用更为容易,并且能够处理超过最长整形类型大小的集合。 bitset 类定义在头文件 bitset中。

它也是一个类模板,定义它的时候,需要声明它包含多少个二进制位:

bitset<32> bitu(99);

它的大小必须是一个常量表达式,定义的这个是有从0到31共32个二进制位,编号 从0开始的进制位为低位,到结束的二进制位称为高位。

bitset中的二进制位将是此模式的一个副本。如果bitset的大小大于一个 unsigned long long中的二进制位数,剩余的高位被置为0,如果小于超过bitset大小的高位被丢弃:

bitset操作:

count ,size,all,any和none等几个操作都不接受参数,它们返回bitset的状态。

当我们使用一个整形值来初始化 bitset 时,这个值将会被转换为 unsigned long long 类型并被当作位模式来处理。

可以用一个string初始化 bitset:

string的下标编号习惯与 bitset 恰好相反:string 中下标最大的字符(最右字符)用来初始化bitset中的低位。当用一个string初始化一个bitset时要记住这个差别。

bitset <32> iu("1100"); //输出00000000000000000000000000001100

提取 bitset 的值

to_ulong 和 to_ullong 操作都返回一个值,保存了与bitset相同的位模式。当然只有当bitset在大小小于等于对应的大小(to_ulong 为 unsigned long , to_ullong 为 unsigned long long )时才能使用。

如果 bitset 中的值不能放入给定类型中,则这两个操作会招聘一个 overflow_error 异常。

可以从键盘读取:

	bitset<16> biu;
	cin >> biu;//从cin读取最多16个0或1 , 若输入其他数字就会输出全0

### C++ 中 `std::bitset` 的使用方法 #### 定义和基本功能 `std::bitset` 是 C++ 标准库中提供的一个模板类,用于表示和操作固定大小的二进制序列。它可以被视作一个大小固定的“位数组”,其中每一位可以是 0 或者 1[^1]。 #### 创建 `std::bitset` 可以通过多种方式创建 `std::bitset` 对象: - **指定长度并初始化为零** ```cpp std::bitset<8> bits; ``` - **通过字符串初始化** ```cpp std::string binaryString = "1100"; std::bitset<4> fromString(binaryString); ``` - **从整数初始化** ```cpp unsigned long value = 27uL; // 即...00011011 std::bitset<16> fromInt(value); ``` 以上三种不同的构造函数展示了如何依据需灵活地构建 `std::bitset` 实例[^5]。 #### 基本操作 ##### 访问单个比特位 利用下标运算符 `[index]` 可以获取特定位置上的值;对于非常量对象而言,还可以直接赋新值给该处的位置。 ```cpp // 获取第 i 位的状态 bool isSet = myBitset[i]; // 设置/重置某一位 myBitset[index] = true; // 设定 myBitset[position] = false;// 清除 ``` ##### 测试与翻转 除了简单的读写之外,还提供了专门的方法来执行更复杂的逻辑操作,比如检测整个集合是否为空(`none`)、是否有任意一位被激活(`any`)以及全部清空(`reset`)等。另外值得注意的是成员函数 `flip()` ,它能够一次性反转所有的位或者仅改变某个具体位置的状态[^3]。 ```cpp if (!bits.none()) { // 至少有一位不为零... } size_t countOnes = bits.count(); bits.flip(); // 所有位取反 bits.flip(index); // 特定位取反 ``` #### 转换与其他实用工具 当需要将内部存储的数据导出成其他形式时,可借助于如下几个辅助接口完成转换工作: - `.to_string()`: 返回由字符 '0' 和 '1' 组成的标准字串表达; - `.to_ulong()/.to_ullong()`: 把当前状态解释为无符号长整形数值(注意溢出风险); - `.test(pos)` : 判断 pos 处的位是否为真[^4]。 ```cpp cout << "As string: " << bits.to_string(); unsigned long numValue = bits.to_ulong(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

syhk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值