bitset的用法

news2025/1/20 19:13:51

bitset的用法

bitset介绍

C++的 bitset 在 bitset 头文件中,它是一种类似数组的结构,它的每一个元素只能是0或1,每个元素仅用1bit空间,相当于一个char元素所占空间的八分之一。

bitset中的每个元素都能单独被访问,例如对于一个叫做foo的bitset,表达式foo[3]访问了它的第4个元素,就像数组一样。

bitset有一个特性:整数类型和布尔数组都能转化成bitset。

bitset的大小在编译时就需要确定。如果你想要不确定长度的bitset,请使用vector。

bitset构造函数

用字符串构造时,字符串只能包含 ‘0’ 或 ‘1’ ,否则会抛出异常。

构造时,需在<>中表明bitset 的大小(即size)。

bitset的大小在编译时就需要确定。

#include<bitset>
std::bitset<4> foo; //创建一个4位的位集,每一位默认为0,当整数的大小小于位数时,高位填充为0

std::bitset<4> foo(5);  //用整数初始化  5二进制位:101  foo值:0101 当整数的大小超过位数时,从整数二进制的低位开始赋值,高位被舍弃

std::bitset<4> foo(19);  //用整数初始化,19二进制位:10011     foo值:0011

std::bitset<4> foo(std::string("0101")); //字符串初始化,字符串中必须只能含有‘0’/‘1’

在进行有参构造时,若参数的二进制表示比bitset的size小,则在前面用0补充(如上面的栗子);

若比bitsize大,参数为整数时取后面部分,参数为字符串时取前面部分(如下面栗子):

	bitset<2> bitset1(12);  //12的二进制为1100(长度为4),但bitset1的size=2,只取后面部分,即00

    string s = "100101";  
    bitset<4> bitset2(s);  //s的size=6,而bitset的size=4,只取前面部分,即1001

    char s2[] = "11101";
    bitset<4> bitset3(s2);  //与bitset2同理,只取前面部分,即1110

    cout << bitset1 << endl;  //00
    cout << bitset2 << endl;  //1001
    cout << bitset3 << endl;  //1110

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BVY5HZQ6-1681310613313)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20230412214311585.png)]

void Func1() {
	//19 10011
	std::bitset<4> bs1(19);
	std::cout << bs1 << std::endl;
	std::bitset<4> bs2(std::string("110011"));
	std::cout << bs2 << std::endl;
}

bitset常用函数

位运算都可以用: 与、或、非、异或,左移,右移
foo&foo2
    
foo|foo2
    
~foo
    
foo^foo2
    
foo<<=2
    
foo>>=2
    
foo.size()      返回大小(位数)
foo.count()     返回1的个数
foo.any()       返回是否有1
foo.none()      返回是否没有1
foo.set()       全都变成1
foo.set(p)      将第p + 1位变成1
foo.set(p, x)   将第p + 1位变成x
foo.reset()     全都变成0
foo.reset(p)    将第p + 1位变成0
foo.flip()      全都取反
foo.flip(p)     将第p + 1位取反
foo.to_ulong()  返回它转换为unsigned long的结果,如果超出范围则报错
foo.to_ullong() 返回它转换为unsigned long long的结果,如果超出范围则报错
foo.to_string() 返回它转换为string的结果

bitset可用操作符

	bitset<4> foo (string("1001"));
    bitset<4> bar (string("0011"));

    cout << (foo^=bar) << endl;       // 1010 (foo对bar按位异或后赋值给foo)
    cout << (foo&=bar) << endl;       // 0010 (按位与后赋值给foo)
    cout << (foo|=bar) << endl;       // 0011 (按位或后赋值给foo)

    cout << (foo<<=2) << endl;        // 1100 (左移2位,低位补0,有自身赋值)
    cout << (foo>>=1) << endl;        // 0110 (右移1位,高位补0,有自身赋值)

    cout << (~bar) << endl;           // 1100 (按位取反)
    cout << (bar<<1) << endl;         // 0110 (左移,不赋值)
    cout << (bar>>1) << endl;         // 0001 (右移,不赋值)

    cout << (foo==bar) << endl;       // false (0110==0011为false)
    cout << (foo!=bar) << endl;       // true  (0110!=0011为true)

    cout << (foo&bar) << endl;        // 0010 (按位与,不赋值)
    cout << (foo|bar) << endl;        // 0111 (按位或,不赋值)
    cout << (foo^bar) << endl;        // 0101 (按位异或,不赋值)

bitset可用函数

	bitset<8> foo ("10011011");

    cout << foo.count() << endl;  //5  (count函数用来求bitset中1的位数,foo中共有5个1
    cout << foo.size() << endl;   //8  (size函数用来求bitset的大小,一共有8位

    cout << foo.test(0) << endl;  //true  (test函数用来查下标处的元素是0还是1,并返回false或true,此处foo[0]为1,返回true
    cout << foo.test(2) << endl;  //false  (同理,foo[2]为0,返回false

    cout << foo.any() << endl;  //true  (any函数检查bitset中是否有1
    cout << foo.none() << endl;  //false  (none函数检查bitset中是否没有1
    cout << foo.all() << endl;  //false  (all函数检查bitset中是全部为1

此外,可以通过 [ ] 访问元素(类似数组),注意最低位下标为0,当然,通过这种方式对某一位元素赋值也是可以的,栗子就不放了。如下:

	bitset<4> foo ("1011");

	cout << foo[0] << endl;  //1
	cout << foo[1] << endl;  //1
	cout << foo[2] << endl;  //0

补充说明一下:test函数会对下标越界作出检查,而通过 [ ] 访问元素却不会经过下标检查,所以,在两种方式通用的情况下,选择test函数更安全一些。

最后,还有一些类型转换的函数,如下:

	bitset<8> foo ("10011011");

    string s = foo.to_string();              //将bitset转换成string类型
    unsigned long a = foo.to_ulong();        //将bitset转换成unsigned long类型
    unsigned long long b = foo.to_ullong();  //将bitset转换成unsigned long long类型

    cout << s << endl;  //10011011
    cout << a << endl;  //155
    cout << b << endl;  //155

std::string的函数:

在这里插入图片描述

对于find和rfind:

  • 匹配的是整个被查找串。 找到了返回下标,找不到返回string::npos(最大值)。

对于find_first_of,find_first_not_of,find_last_of,find_last_not_of:

  • 匹配的是被查找串中的任意字符。
#include <iostream>
#include <memory>
#include <string>
#include <vector>
#include <set>
#include <map>
using namespace std;
int main(int argc, const char *argv[])
{
string src = "vimer.cn";
 
string str1 = "mer";
string str2 = "sre";
 
size_t pos;
 
pos = src.find(str1);
cout<<pos<<endl;
 
pos = src.find(str2);
cout<<pos<<endl;
 
pos = src.find_first_of(str1);
cout<<pos<<endl;
 
pos = src.find_first_of(str2); //找不到返回-1
cout<<pos<<endl;
 
return 0;
}

输出结果:

2
std::string::npos
2
3

结果中4294967295即string::npos,代表没有找到。而在find_first_of(str2)的时候返回的是3,即字符’e’,d代表查找某个字符,证明了我们之前的说法。

    字符串插入和删除
    string& insert(int pos,const char* p)
    string& insert(int pos,string& str)

    string& erase(int pos,int n) 从pos位置删除n个字符
        
    截取子串
    string substr(int pos,int n) 从pos位置截取n个字符
        
    int find_first_of(char c, int start = 0):
       查找字符串中第1个出现的c,由位置start开始。 如果有匹配,则返回匹配下标位置;否则,返回-1.默认情况下,start为0,函数搜索整个字符串。

  	int find_last_of(char c):
       查找字符串中最后一个出现的c。有匹配,则返回匹配位置;否则返回-1。 该搜索在字符末尾查找匹配,所以没有提供起始位置。
           
    字符串拼接
    string& operator+=(const char* p)
    string& operator+=(const string& str)
    string& operator+=(const char c)

    string& append(const char* p)
    string& append(const char*p,int n)  //const char* p 默认从位置0到n拼接
    string& append(const string& str)
    string& append(const string& str,int start,int end)
    string& append(int n,char c)

在这里插入图片描述

获取输入整数的二进制位:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1vC6t7hI-1681310613316)(C:\Users\hp\AppData\Roaming\Typora\typora-user-images\image-20230412222630445.png)]

	while (std::cin >> n)
	{
		//把十进制n放到bitset中进行自动转化;
		std::bitset<100> b(n);                    
		//将其转化为string    
		std::string str = b.to_string();          
		//利用string函数去除前面的0
		str.erase(0, str.find_first_not_of('0')); 
		std::cout << str.find_first_not_of('0') << std::endl;
		std::cout << str << std::endl;
	}

字符符串中提取连续字符序列,既子串。 这个操作假定位置 start 和 字符数 count。

string substr(int start=0,int count= -1);
从起始位置开始复制字符串中的count 个字符,并返回这些字符作为子串。

如果字符串尾部小于count字符或者count 为-1,则字符串尾停止复制。

如果不使用参数调用只包括位置start,则substr()返回从位置开始到字符串尾部的子串。

find()函数在字符串中查找指定模式。该函数将字符串s和位置start作为参数,并查找 s的匹配作为子串。

int find(const string& s,int start = 0):
该搜索获得字符串s和位置start,并查找s的匹配作为子串。 如果有匹配,则返回匹配的位置;否则返回-1。默认情况下, start为0,函数搜索整个字符串。

  • std::length(),取得字符串的长度。

  • std::substr(),从字符串中取出一个子串。

  • std::at()/operator [],取得字符串中指定位置的字符。

  • std::find/rfind(),从前往后/从后往前在字符串中查找一个子串的位置。 强调字符串

  • std::find_first_of(),在字符串中找到第一个在指定字符集中的字符位置。 强调字符

  • std::find_first_not_of(),在字符串中找到第一次不在指定字符集中的字符位置。强调字符

  • std::find_last_of(),在字符串中找到最后一个在指定字符集中的字符位置。

  • std::find_last_not_of(),在字符串中找到最后一个不在字符集中的字符位置。

  • std::transform(str.begin(), str.end(), str.begin(), tolower);将字符串转换为小写。

  • std::transform(str.begin(), str.end(), str.begin(), toupper);将字符串转换为大写。、

  • str.erase(0, str.find_first_not_of(" \t\n\r")); 去掉头部空格

  • str.erase(str.find_last_not_of(" \t\n\r") + 1); 去掉尾部空格

     1 void trim(string &s)
     2 {
     3     /*
     4     if( !s.empty() )
     5     {
     6         s.erase(0,s.find_first_not_of(" "));
     7         s.erase(s.find_last_not_of(" ") + 1); //找到不是空格的位置,然后加1 就是空格位置
     8     }
     9     */
    10     int index = 0;
    11     if( !s.empty())
    12     {
    13         while( (index = s.find(' ',index)) != string::npos)
    14         {
    15             s.erase(index,1);
    16         }
    17     }
    18 
    19 }
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/434609.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MyBatis-Plus Generator v3.5.1 最新代码自动生成器

一、概述 官网&#xff1a;https://baomidou.com/ 官方文档 &#xff1a;https://baomidou.com/pages/56bac0/ 官方源码地址&#xff1a; https://gitee.com/baomidou/mybatis-plus 官方原话&#xff1a; AutoGenerator 是 MyBatis-Plus 的代码生成器&#xff0c;通过 Auto…

【TMT数据传不到MES中间库】-F18

MES中间库有张表:T_Z_ERPSCInfo TMT机台落纱后,会把落纱的数据传到T_Z_ERPSCInfo去。 目前总是有几个机台(以F18举例),落纱了,数据没有过来。 起初以为是没有访问权限的问题,在机台上telnet ip+端口,发现没问题。 后来认为是数据库的账号有问题。 download了一份日…

Oracle EBS数据定义移植工具:FNDLOAD

在实际的EBS二次开发中&#xff0c;我们经常会碰到需要在各个环境之间移植二次开发的程序对象以及数据定义&#xff0c;如在EBS二次开发中并发请求的定义会涉及到&#xff1a; 可执行、并发程序、值集、请求组等的定义&#xff0c;定义需要从开发环境、测试环境、UAT环境一直到…

AI智慧工地视频分析系统 yolov7

AI智慧工地视频分析系统通过yolov7网络模型视频智能分析技术&#xff0c;AI智慧工地视频分析算法模型对画面中物的不安全状态以及现场施工作业人员的不合规行为及穿戴进行全天候不间断实时分析&#xff0c;发现有人不合规行为及违规穿戴抽烟打电话等立即自动抓拍存档告警。在架…

跨平台开发之 Tauri

比起 Electron&#xff0c;Tauri 打包后的安装包体积是真的小。 跨平台开发 最近使用跨平台开发框架写了一个软件&#xff0c;在此记录一下。 说起跨平台开发&#xff0c;我的理解是这样的&#xff1a; 多依赖浏览器环境运行多使用前端语言进行开发只需一次编码&#xff0c;…

JavaScript的this关键字

文章目录 一、JavaScript this 关键字总结 一、JavaScript this 关键字 面向对象语言中 this 表示当前对象的一个引用。 但在 JavaScript 中 this 不是固定不变的&#xff0c;它会随着执行环境的改变而改变。 在方法中&#xff0c;this 表示该方法所属的对象。 如果单独使用&a…

2023/4/18总结

项目 实现了服务器和客户端的连接&#xff0c;在登录注册上面。 然后去实现了密码MD5化&#xff0c;通过java自带的&#xff0c;去实现了MD5. public String getMD5(String str) throws NoSuchAlgorithmException {MessageDigest mdMessageDigest.getInstance("MD5&quo…

SSTI模板注入小结

文章目录 一、漏洞简述&#x1f37a;二、flask模板注入&#x1f37a;三、shrine&#xff08;攻防世界&#xff09;&#x1f37a;四、SSTI注入绕过&#x1f37a; 一、漏洞简述&#x1f37a; 1、SSTI&#xff08;Server-Side Template Injection&#xff0c;服务器端模板注入&am…

5个面向Python高级开发者的技巧

使用这些用于自定义类行为、编写并发代码、管理资源、存储和操作数据以及优化代码性能的高级技术来探索 Python 的深度。 本文探讨了 Python 中的五个高级主题&#xff0c;它们可以为解决问题和提高代码的可靠性和性能提供有价值的见解和技术。从允许您在定义类时自定义类行为的…

SpringBoot基础学习之(二十):Shiro与Thymeleaf的整合版本

还是一样&#xff0c;本篇文章是在上一篇文章的基础上&#xff0c;实施再次进阶 Shiro是一种特别的流行的安全框架&#xff0c;Thymeleaf则是spring boot架构中使用的一种特别引擎。今天介绍的则是它们俩的整合版本。 实现的功能&#xff1a;前端的显示的内容&#xff0c;是根…

vi/vim命令,使用vi编辑器命令详解

linux常用命令:vi/vim vi命令有三种模式&#xff1a;一般模式&#xff0c;编辑模式&#xff0c;命令模式&#xff08;底行模式&#xff09; 可以通过 vi [文件路径]文件名 的命令启动vi&#xff0c;并且打开指定的文件进行查看、编辑&#xff0c;其中[文件路径] 是可选参数。如…

微信小程序开发:实现毛玻璃效果

前言 在微信小程序开发的时候&#xff0c;也会遇到一些和在前端开发一样的样式需求&#xff0c;二者的相通类似性非常的高&#xff0c;就拿样式相关的需求来说&#xff0c;可以说是一模一样的操作。那么本文就来分享一个关于实现高斯模糊效果的需求&#xff0c;微信小程序和前端…

【Linux网络服务】FTP服务

FTP服务 一、FTP服务1.1FTP服务概述1.2FTP服务的特点1.3FTP服务工作过程 二、设置FTP服务2.1实验一&#xff1a;设置匿名用户访问FTP服务&#xff08;最大权限&#xff09;2.2实验二&#xff1a;设置本地用户验证访问ftp&#xff0c;并禁止切换到ftp以外的目录&#xff08;默认…

Linux- 进程的切换和系统的一般执行过程

我想在介绍进程切换之前&#xff0c;先引入中断的相关知识&#xff0c;它是我们理解进程切换的重要前提&#xff0c;也是Linux操作系统的核心机制。 中断的类型 • 硬件中断&#xff08;Interrupt&#xff09;&#xff0c;也称为外部中断&#xff0c;就是CPU的两根引脚&…

微服务学习-SpringCloud -Nacos (集群及CP架构相关学习)

文章目录 Nacos集群下心跳机制相对于单机会有怎样的改变&#xff1f;CAP原则和BASE原则常见的注册中心实现对比Nacos集群实现协议Nacos CP架构实现源码Nacos CP架构leader是如何选举的呢&#xff1f; Nacos集群下心跳机制相对于单机会有怎样的改变&#xff1f; 在上一遍单机模…

百万赞同:网络安全为什么缺人? 缺什么样的人?

1.网络安全为什么缺人? 缺人的原因是有了新的需求 以前的时候&#xff0c;所有企业是以产品为核心的&#xff0c;管你有啥漏洞&#xff0c;管你用户信息泄露不泄露&#xff0c;我只要做出来的产品火爆就行。 这一切随着《网络安全法》、《数据安全法》、《网络安全审查办法》…

No.041<软考>《(高项)备考大全》【第25章】量化项目管理

第25章】量化项目管理 1 考试相关2 量化项目管理3 准备量化管理项目4 量化的管理项目5 练习题参考答案: 1 考试相关 选择可能考0-1分&#xff0c;案例论文不考。 2 量化项目管理 量化项目管理&#xff08;QPM&#xff09;的目的在于量化地管理项目&#xff0c;以达成项目已建…

Auto-GPT 5分钟详细部署指南

安装 conda 1. 下载安装 miniconda3 &#xff1a; Miniconda — conda documentation conda是一个包和环境管理工具&#xff0c;它不仅能管理包&#xff0c;还能隔离和管理不同python版本的环境。类似管理nodejs环境的nvm工具。 2. conda环境变量&#xff1a; 新建 CONDA_H…

混合网络监控工具

多年来&#xff0c;网络不可避免地变得更加复杂。混合网络架构包括跨多个供应商的 LAN、WAN、公共或私有云存储以及混合云。简而言之&#xff0c;它是虚拟和物理网络组件的混合体&#xff0c;自远程工作出现以来&#xff0c;这种类型的网络架构已经起飞。 什么是混合网络 混合…

【《C和指针》笔记】第一章<快速上手>

注释以/*开始到*/结束或者使用// .预处理指令&#xff1a;因为它们是由预处理器解释的&#xff0c;预处理器读入代码&#xff0c;根据预处理指令对其进行修改&#xff0c;然后把修改过的源代码递交给编译器。预处理指令&#xff08;#include、#define&#xff09;所定义的变量…