C++标准库(八):bitset 类型

本文为《C++ Primer》的读书笔记

#include <bitset>
  • 标准库定义了bitset类, 使得位运算的使用更为容易, 并且能够处理超过最长整型类型大小的位集合

定义和初始化bitset

默认初始化

在这里插入图片描述

  • bitset类似array具有固定的大小大小必须是一个常量表达式。当我们定义一个bitset时,需要声明它包含多少个二进制位:
bitset<32> bitvec; // 32位;全部位均为0

使用unsigned long long 初始化

在这里插入图片描述

  • 当我们使用一个整型值来初始化bitset时,此值将被转换为unsigned long long类型并被当作位模式来处理。bitset中的二进制位将是此模式的一个副本
    • 如果bitset的大小大于一个unsigned long long中的二进制位数, 则剩余的高位被置为0
    • 如果bitset的大小小于一个unsigned long long中的二进制位数, 则超出bitset大小的高位被丢弃
// bitvecl比初始值小;初始值中的高位被丢弃
bitset<13> bitvec1(0xbeef); //二进制位序列为1111011101111
// bitvec2比初始值大;它的高位置0
bitset<20> bitvec2(0xbeef); //二进制位序列为000010111110111011 11
// 在64位机器中,long long 0ULL是64个0比特, 因此~0ULL是64个1
bitset<128> bitvec3(~0ULL); // 0~63位为l; 63~127位为0

从一个string / 字符数组 初始化bitset

在这里插入图片描述

  • 我们可以从一个string或一个字符数组指针来初始化bitset。两种情况下, 字符都直接表示位模式。字符串中下标最小的字符对应高位;如果string包含的字符数比bitset少, 则bitset的高位被置为0:
bitset<32> bitvec4("1100"); // 2 、3两位为1, 剩余两位为0

注意:string的下标编号习惯与bitset恰好相反:string中下标最大的宇符(最右字符)用来初始化bittset中的低位(下标为0的二进制位)

我们可以只用一个子串作为初始值:

string str("1111111000000011001101");
bitset<32> bitvec5(str, 5, 4); 				// 从str[5]开始的四个二进制位,1100
bitset<32> bitvec6(str, str.size() - 4); 	// 使用最后四个字符

bitset操作

  • bitset操作定义了多种检测或设置一个或多个二进制位的方法。bitset类还支持位运算符
    在这里插入图片描述
  • 下标运算符对const属性进行了重载。const版本的下标运算符在指定位置位时返回true, 否则返回false。非const版本返回bitset定义的一个特殊类型, 它允许我们操纵指定位的值:
bitvec[0] = 0; 			// 将第一位复位
bitvec[31] = bitvec[0]; // 将最后一位设置为与笫一位一样
bitvec[0].flip(); 		// 翻转笫一位
~bitvec[0]; 			// 等价操作, 也是翻转第一位
bool b = bitvec[0]; 	// 将 bitvec[0] 的值转换为 bool 类型

可以通过位置来访问bitset中的二进制位。例如,bitvec包含编号从0到31的32个二进制位。编号从0开始的二进制位被称为低位(low-order),编号到31结束的二进制位被称为高位(high-order)

  • bitset 的输入运算符从一个输入流读取字符, 保存到一个临时的string对象中。直到读取的字符数达到对应bitset的大小时,或是遇到不是1或0的字符时,或是遇到文件尾或输入错误时,读取过程才停止。随即用临时string对象来初始化bitset 。如果读取的字符数小于bitset 的大小, 则与往常一样, 高位将被置为 0
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值