bitset用法详解

一、bitset简介

bitset是C++ STL库中的一个类,用于存储二进制位的布尔值,提供了简单的位操作函数。bitset对象可以控制每个位的值为0或1。可以看做是一种高效的位图。

#include
using namespace std;

二、bitset的常规用法

1、创建bitset变量

创建一个bitset变量,参数表示变量长度,即二进制位数。默认构造函数构造的bitset变量所有位的值都是0。通过构造函数bitset(int n, unsigned long value)可以构造一个值为value的n位bitset对象。

bitset bits;   //创建一个长度为8的bitset对象,所有位初始值都为0
bitset bits1(0b10101010); //创建一个长度为8的bitset对象,数值为0b10101010

2、访问bitset变量

使用[]运算符或者字符串形式的下标来访问bitset变量的对应位,如bits[2]或bits[“010”]表示访问第3位,下标从0开始。

bitset bits(0b10101010);
cout<<bits[0]<<" "<<bits[2]<<" "<<bits[7]<<endl;  //输出 0 1 0

3、bitset变量输入输出

bitset变量可以通过iostream库中的输入输出函数使用,bitset对象可以用作输出流和输入流。

bitset bits(0b10101010);
cout<<bits<>bits;          //输入一个二进制数到bits

4、bitset变量设置和清除

使用set()方法可以将某一位设置为1,reset()方法可以将某一位设置为0。

bitset bits;
bits.set(2);        //将第3位设置为1
bits.reset(1);      //将第2位设置为0

5、bitset变量的位运算

bitset对象提供了基本的位运算函数,包括按位与、按位或、按位异或、按位取反。可以使用与、或、异或、取反运算符或者对应的成员函数进行位运算。

bitset a(0b11001100);
bitset b(0b10101010);
bitset c = a & b;  //按位与
bitset d = a | b;  //按位或
bitset e = a ^ b;  //按位异或
bitset f = ~a;     //按位取反

三、bitset的高级用法

1、bitset对象的大小控制

使用size()方法可以获取bitset对象的位数,max_size()方法可以获取bitset对象所能包含的最大位数。使用count()方法可以获取bitset中1的数量,flip()方法可以将所有位取反。

bitset bits(0b10101010);
cout<<bits.size()<<endl;    //输出8,bits对象包含8个二进制位
cout<<bits.count()<<endl;   //输出4,bits对象中1的数量为4
bits.flip();                //将所有位取反

2、bitset对象的截取和连接

使用to_ulong()和to_ullong()方法可以将bitset对象转换为unsigned long和unsigned long long类型。使用to_string()方法可以将bitset对象转化为string类型。使用operator<>可以将bitset对象截取或连接。两个bitset对象可以拼接成一个较长的对象。

bitset a(0b1010);
bitset b(0b11110000);
unsigned long c = a.to_ulong();
cout<<c<<endl;              //输出10,将a转换为unsigned long类型
string d = a.to_string();
cout<<d<<endl;              //输出“1010”,将a转换为string类型
bitset e = (a<<8) | b;
cout<<e<<endl;              //输出“101011110000” 用a左移8位的结果与b拼接成一个12位的bitset对象

四、bitset的应用

bitset可以用于大量的位运算问题,如压位DP、游戏中的状态存储、压缩算法、密码学等方面。

代码示例

#include
#include
using namespace std;

int main() {
  //常规用法
  bitset bits;   //创建一个长度为8的bitset对象,所有位初始值都为0
  bitset bits1(0b10101010); //创建一个长度为8的bitset对象,数值为0b10101010
  cout<<bits1[0]<<" "<<bits1[2]<<" "<<bits1[7]<<endl;  //输出 0 1 0

  bitset bits2(0b10101010);
  cout<<bits2<>bits2;           //输入一个二进制数到bits2

  bitset bits3(0b10101010);
  bits3.set(2);        //将第3位设置为1
  bits3.reset(1);      //将第2位设置为0
  cout<<bits3<<endl;    //输出10101100

  bitset a(0b11001100);
  bitset b(0b10101010);
  bitset c = a & b;  //按位与
  bitset d = a | b;  //按位或
  bitset e = a ^ b;  //按位异或
  bitset f = ~a;     //按位取反
  cout<<c<<" "<<d<<" "<<e<<" "<<f<<endl;  //输出“10001000 11101110 01100110 00110011”

  //高级用法
  bitset bits4(0b10101010);
  cout<<bits4.size()<<endl;    //输出8,bits对象包含8个二进制位
  cout<<bits4.count()<<endl;   //输出4,bits对象中1的数量为4
  bits4.flip();                //将所有位取反
  cout<<bits4<<endl;           //输出“01010101”

  bitset a1(0b1010);
  bitset b1(0b11110000);
  unsigned long c1 = a1.to_ulong();
  cout<<c1<<endl;              //输出10,将a1转换为unsigned long类型
  string d1 = a1.to_string();
  cout<<d1<<endl;              //输出“1010”,将a1转换为string类型
  bitset e1 = (a1<<8) | b1;
  cout<<e1<<endl;              //输出“101011110000” 用a1左移8位的结果与b1拼接成一个12位的bitset对象

  return 0;
}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/191132.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-11-30 09:08
下一篇 2024-11-30 09:08

相关推荐

  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25

发表回复

登录后才能评论