C++标准库类型,bitset类型

bitset类

std::bitset类的主要作用是提供一种简单而高效的方式来处理位数据。在某些情况下,位操作是非常有用的,例如在编写加密算法、压缩算法、图形处理等应用程序时。使用std::bitset,可以轻松地表示和操作二进制位,而不需要自己实现位运算。

  • std::bitset还可以用于位图操作。在计算机图形学中,位图是一种将图像表示为二进制位序列的方式,每个位代表图像中的一个像素。使用std::bitset,可以轻松地创建、修改和操作这些位图。

  • 此外,std::bitset还可以用于位集合的表示和操作,例如在集合论、布尔代数和离散数学中。在这些领域中,位集合经常用于表示一个有限集合,其中每个元素由一个二进制位表示,该位对应的值为1表示元素存在,否则为0。

总之,bitset是一个十分有用的工具,可以方便地处理位数据,帮助我们更加高效地编写代码

定义和初始化bitset

bitset类是一个类模版,它类似于array类,具有固定的大小。当我们声明一个bitset类时,需要声明它包含了多少个二进制位,如:bitset<32> bit (1); //共32位,低位为1,其余位都为0。二进制位为 0000 0001

这个大小必须是一个常量。上例bit是一个含有32个位的bitset。我们可以用下标运算符去访问对应的位数。因此,bit包含从0到31,共32个二进制位。从编号0开始的二进制位被称为低位,编号到31结束的二进制位被称作是高位

下面是一些常见的定义和初始化std::bitset对象的方法:

  1. 使用默认构造函数

    std::bitset<8> bits; // 创建一个有8位的bitset,默认所有位的值都是0
    
  2. 使用整数类型初始化

    std::bitset<8> bits1(0b10101010); // 创建一个有8位的bitset,初始化值为10101010(二进制)
    std::bitset<8> bits2(170); // 创建一个有8位的bitset,初始化值为170(十进制)
    
  3. 使用字符串初始化

    std::bitset<8> bits1("10101010"); // 创建一个有8位的bitset,初始化值为10101010(二进制字符串)
    std::bitset<8> bits2("AA", 16); // 创建一个有8位的bitset,初始化值为AA(十六进制字符串)
    
  4. 复制初始化

    std::bitset<8> bits1("10101010"); // 创建一个有8位的bitset,初始化值为10101010(二进制字符串)
    std::bitset<8> bits2 = bits1; // 使用bits1的值创建一个新的bitset
    

如果初始值的二进制位大于或小于bitset的小怎么办?

当我们使一个整形值初始化一个bitset是时,这个值会被转换为 unsigned long long 类型,并被当做位模式来进行处理。我们的bitset的二进制位会去与这个值的二进制位从低位到高位去做一一对应。

如果bitset的二进制位多于这个值的二进制位数了话,则bitset中剩余的高位会被置为0。

如果bitset的二进制位少于这个值的二进制位数了话,则这个值超出bieset的最大位数的二进制位则会被舍弃。

  • 例如我将一个十进制数15去赋值给一个bitset大小为8的类型:

    bitset<8> bit (15); // 二进制序列为 0000 1111
    int a = bit.to_ulong(); //a = 15
    
  • 例如我将一个十进制数15去赋值给一个bitset大小为3的类型:

    bitset<3> bit(15); //二进制序列为 111
    int a = bit.to_ulong(); //a = 7
    

bitset可以进行的操作(内置函数)

std::bitset是一个标准库类,提供了多个成员函数来操作和查询位集合。下面列出了std::bitset的常用成员函数,包括一些用于查询和操作位集合的函数:

  • std::bitset::operator[]:获取位集合中指定位置(下标)的值。

  • std::bitset::size:获取位集合的大小(即位数)。

  • std::bitset::count:获取位集合中值为1的位的数量。

  • std::bitset::any:检查位集合中是否存在值为1的位。

  • std::bitset::none:检查位集合中是否不存在值为1的位。

  • std::bitset::all:检查位集合中是否所有位的值都为1。

  • std::bitset::test:检查位集合中指定位置的值是否为1。

  • std::bitset::set:将位集合中指定位置的值设为1。

  • std::bitset::reset:将位集合中指定位置的值设为0。

  • std::bitset::flip:翻转位集合中指定位置的值。

  • std::bitset::to_ulong:将位集合转换为一个unsigned long类型的值。

  • std::bitset::to_ullong:将位集合转换为一个unsigned long long类型的值。

  • std::bitset::to_string:将位集合转换为一个二进制字符串。

代码示例:展示bitset中内置函数的用法

#include <vector>
#include <iostream>
#include <bitset>
using namespace std;


int main() {
  bitset<8> bits("10101010");

  // 获取第3位的值
  bool bit3 = bits[2];
  cout << "bits[2] = " << bit3 << endl;

  // 获取位集合的大小
  cout << "bits size = " << bits.size() << endl;

  // 获取值为1的位的数量
  cout << "bits count = " << bits.count() << endl;

  // 检查位集合中是否存在值为1的位
  bool any = bits.any();
  cout << "bits any = " << any << endl;

  // 将第5位设为1
  bits.set(4);
  cout << "bits = " << bits << endl;

  // 将第5位设为0
  bits.reset(4);
  cout << "bits = " << bits << endl;

  // 翻转第3位
  bits.flip(2);
  cout << "bits = " << bits << endl;

  // 将位集合转换为一个二进制字符串
  string str = bits.to_string();
  cout << "bits as string = " << str << endl;

  return 0;
}

总结

bitset类是一个非常好用的的位运算工具,谁用谁知道,函数方法简单明了有效。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿宋同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值