详解C++ bitset用法

详解C++ bitset用法

bitset是C++ STL中的一个类,用于位运算。它最主要的作用是用来压缩表示布尔值数组。bitset内部使用一个数组来存储每个位的状态,这个数组通常使用一个整数类型的数组,每个整数通常为一个字长,即32或64位。可以使用位运算符对bitset进行各种操作。

本文将详细讲解bitset的用法,以及两个示例说明。

基本用法

要使用bitset,首先需要包含头文件<bitset>。可以用以下方法定义bitset对象:

bitset<8> bits;            // 定义大小为8位的bitset对象,初始值为0
bitset<8> bits(0b101010);  // 定义并初始化为二进制101010
bitset<8> bits("101010");  // 定义并初始化为字符串"101010"

可以通过以下方式访问和设置bitset对象中的位:

bitset<8> bits("101010");
bits.set(0);               // 将第0位设置为1
bits.reset(1);             // 将第1位设置为0
bits[2] = 1;               // 通过下标操作符将第2位设置为1
bits.flip(3);              // 将第3位取反

可以通过以下方式输出bitset对象:

bitset<8> bits("101010");
cout << bits << endl;       // 输出:101010

位操作

以下是一些基本的位操作函数:

  • count():返回bitset中为1的位数。
  • digits():返回bitset中存储的整数个数。
  • size():返回bitset中的位数。
  • test(i):返回第i位是否为1。
  • to_ulong():将bitset转换为unsigned long类型。
  • to_ullong():将bitset转换为unsigned long long类型。

以下是一些基本的位运算操作:

  • &:按位与。
  • |:按位或。
  • ^:按位异或。
  • ~:按位取反。

下面是一些bitset的位运算示例:

bitset<8> bits1("101010");
bitset<8> bits2("010101");
bitset<8> bits3;

bits3 = bits1 & bits2;     // 按位与,得到000000
bits3 = bits1 | bits2;     // 按位或,得到111111
bits3 = bits1 ^ bits2;     // 按位异或,得到111111
bits3 = ~bits1;            // 按位取反,得到010101

示例1:二进制转十进制

以下示例展示如何使用bitset将二进制数转换为十进制数:

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

int main()
{
    // 定义大小为8位的bitset对象,初始值为0
    bitset<8> bits("10101010");

    // 输出二进制数
    cout << "二进制数:" << bits << endl;

    // 转换为十进制数
    unsigned long num = bits.to_ulong();
    cout << "十进制数:" << num << endl;

    return 0;
}

上述代码输出结果为:

二进制数:10101010
十进制数:170

示例2:统计字符串中字母出现的次数

以下示例展示如何使用bitset统计字符串中每个字母出现的次数:

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

int main()
{
    string s = "abababcccddd";

    // 统计每个字母出现的次数
    bitset<26> bs;
    for (int i = 0; i < s.size(); i++) {
        char c = s[i];
        bs[c - 'a'] = 1;
    }

    // 输出每个字母出现的次数
    for (char c = 'a'; c <= 'z'; c++) {
        if (bs[c - 'a']) {
            int cnt = 0;
            for (int i = 0; i < s.size(); i++) {
                if (s[i] == c) cnt++;
            }
            cout << c << ":" << cnt << endl;
        }
    }

    return 0;
}

上述代码输出结果为:

a:3
b:3
c:3
d:3

这是因为字符串中每个字母都出现了3次。

结论

本文介绍了bitset的基本用法和位操作,同时给出了两个使用bitset的实际示例。bitset在处理位运算问题时非常方便,如果我们需要处理大量的布尔值,并希望使用最少的空间,那么bitset是一个非常有用的工具。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解C++ bitset用法 - Python技术站

(0)
上一篇 2023年6月26日
下一篇 2023年6月26日

相关文章

  • win11刚开机cpu就满了怎么办?win11刚开机cpu占用100%解决方案

    针对“win11刚开机cpu就满了怎么办?win11刚开机cpu占用100%解决方案”这个问题,我给出以下完整的攻略: 问题原因分析 首先需要分析导致 CPU 占用率达到100% 的原因,这主要包括以下几个方面: 进程异常:可能有某些进程异常,一直占用 CPU。 资源竞争:某些高 CPU 使用率的程序在同一时间竞争计算机资源。 系统服务异常:有时某些系统服务…

    other 2023年6月26日
    00
  • Android后台模拟点击探索(附源码)

    Android后台模拟点击探索(附源码)攻略 本攻略将详细介绍如何在Android应用中使用后台模拟点击的技术。通过模拟点击,我们可以在后台执行一些用户交互操作,例如点击按钮、输入文本等。这对于自动化测试、批量操作等场景非常有用。 步骤一:添加权限 首先,在AndroidManifest.xml文件中添加以下权限: <uses-permission a…

    other 2023年9月7日
    00
  • Java语言中4种内部类的超详细讲解

    Java语言中4种内部类的超详细讲解 在Java语言中,内部类是指定义在其他类内部的类。它们可以访问外部类的成员,并且提供了一种实现封装和组织代码的方式。Java语言中有四种类型的内部类,分别是:成员内部类、静态内部类、局部内部类和匿名内部类。下面将对这四种内部类进行详细讲解,并提供示例说明。 1. 成员内部类(Member Inner Class) 成员内…

    other 2023年8月8日
    00
  • nginx重启方法详解

    nginx重启方法详解 Nginx是一款高性能的Web服务器和反向代理服务器,常用于搭建静态网站、负载均、反向代理等。在修改Nginx配置文件后,需要重启Nginx才能使配置生效。本文将详细介绍Nginx重启的方法,并提供两个示例说明。 方法一:使用ctl命令重启Nginx 在使用systemd管理Nginx服务的Linux系统中,可以使用systemctl…

    other 2023年5月7日
    00
  • 魔兽世界7.2.5邪DK怎么堆属性 wow7.25邪DK属性优先级攻略

    魔兽世界7.2.5邪DK怎么堆属性 1. 邪DK属性优先级 邪恶力量(Mastery)> 全能(Versatility)> 暴击(Critical Strike)> 急速(Haste) 2. 套装选择 邪恶力量为邪DK的最大输出属性,因此需要选择巨神殿的套装,在满足邪恶力量达到35%的前提下,尽可能地增加全能属性。 3. 宝石镶嵌 首先,宝…

    other 2023年6月27日
    00
  • 魔方软件 内存转为硬盘(图文教程)

    魔方软件 内存转为硬盘(图文教程) 本教程将详细讲解如何使用魔方软件将内存转存到硬盘上。这个过程可以帮助你释放内存空间,提高计算机的性能。下面是详细的步骤: 步骤一:下载和安装魔方软件 首先,你需要下载并安装魔方软件。你可以在官方网站或其他可信的软件下载网站上找到魔方软件的最新版本。下载完成后,按照安装向导的指示进行安装。 步骤二:打开魔方软件 安装完成后,…

    other 2023年8月1日
    00
  • 微信公众号如何获取用户unionid

    以下是关于“微信公众号如何获取用户unionid”的完整攻略,包含两个示例。 微信公众号如何获取用户unionid 在微信公众号开发中,我们通常需要获取用户的unionid,以更好地管理用户。以下是关于如何获取用户unionid的详细攻略。 1. 用户授权获取 在用户授权登录时,我们可以通过OAuth2.0协议获取用户的unionid。以下是一个示例: //…

    other 2023年5月9日
    00
  • JavaScript嵌入百度地图API的最详细方法

    JavaScript嵌入百度地图API主要分为以下几个步骤: 步骤1:获取百度地图API的Key 访问百度地图开放平台 http://lbsyun.baidu.com/,注册账号并登录 进入控制台,创建一个新的应用,在应用详情页面就可以查看到自己的apiKey 步骤2:引入百度地图API 将以下代码添加至 HTML 文件中: <!DOCTYPE htm…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部