网站做桌面应用 iOS/郑州seo外包费用
文章目录
- 一、bitset接口总览
- 二、bitset模拟实现
- 1. 构造函数
- 2. set、reset、flip、test
- 3. size、count
- 4. any、none、all
- 5. 打印函数
- 三、完整代码
一、bitset接口总览
成员函数 | 功能 |
---|---|
set | 设置指定位或所有位为1(即设置为“已设置”状态) |
reset | 清空指定位或所有位,将其设为0(即设置为“未设置”状态) |
flip | 反转指定位或所有位的状态。如果位是0,则变为1;如果位是1,则变为0 |
test | 获取指定位的状态。如果位是1,则返回true;如果位是0,则返回false |
count | 获取被设置为1的位的个数(即“已设置”的位的数量) |
size | 获取位图可以容纳的位的总数。这通常指的是位图数组的总大小(以位为单位) |
any | 如果有任何一个位被设置为1(即至少有一个位是“已设置”状态),则返回true;否则返回false |
none | 如果没有位被设置为1(即所有位都是“未设置”状态),则返回true;否则返回false |
all | 如果所有位都被设置为1(即所有位都是“已设置”状态),则返回true;否则返回false |
#pragma once
#include <iostream>
#include <vector>
#include <assert.h>
namespace qi
{template <size_t N>class bitset{private:std::vector<int> _bits;public:bitset();void set(size_t pos);void reset(size_t pos);void flip(size_t pos);size_t size();size_t count();bool test(size_t pos);bool any();bool none();bool all();void Print(); //打印函数};
}
二、bitset模拟实现
1. 构造函数
在创建位图的时候我们需要根据所给的参数N,来构造一个N位的位图,并将该位图的所有位全部设置为0。
这里我们使用vector来做底层容器,一个int有32个比特位,但是非类型模板参数N,不一定总是32的整数倍,所以我们在构造的时候得先计算一下需要几个int。
例如,假如我们要建立一个50个比特位的位图,就需要两个int大小,共64个比特位,使用前50个比特位,后14个舍弃不用就好。
因此我们用式子 N/32+1
来计算需要几个int。
具体实现也比较简单,直接调用vector的resize函数即可。
bitset()
{_bits.resize(N / 32 + 1, 0);
}
2. set、reset、flip、test
set,根据下标pos,把位图的该位置设置成1
- 计算出该位位于第 i 个整数的第 j 个比特位。
- 将1左移 j 位后与第 i 个整数进行或运算即可。
void set(size_t pos)
{assert(pos < N);int i = pos / 32;//第几个整数,算出来的i相当与下标int j = pos % 32;//第i个整数的第j个比特位,j也相当于下标//注意下标都是从0开始的_bits[i] |= (1 << j);
}
reset根据下标pos,将下标为pos位置的位图设置成0
- 计算出该位位于第 i 个整数的第 j 个比特位。
- 将1左移 j 位再整体反转后与第 i 个整数进行与运算即可。
void reset(size_t pos)
{assert(pos < N);int i = pos / 32;//第几个整数,算出来的i相当与下标int j = pos % 32;//第i个整数的第j个比特位,j也相当于下标//注意下标都是从0开始的_bits[i] &= (~(1 << j));//左移后要取反在&
}
flip根据下标pos反转指定下标的比特位
- 计算出该位位于第 i 个整数的第 j 个比特位。
- 将1左移 j 位后与第 i 个整数进行异或运算即可。
void flip(size_t pos)
{assert(pos < N);int i = pos / 32;//第几个整数,算出来的i相当与下标int j = pos % 32;//第i个整数的第j个比特位,j也相当于下标//注意下标都是从0开始的_bits[i] ^= (1 << j);
}
test检测下标pos处的位图是否为1,为1返回true,否则返回false
- 计算出该位位于第 i 个整数的第 j 个比特位。
- 将1左移 j 位后与第 i 个整数进行与运算得出结果。
- 若结果非0,则该位被设置,否则该位未被设置。
bool test(size_t pos)
{assert(pos < N);int i = pos / 32;//第几个整数,算出来的i相当与下标int j = pos % 32;//第i个整数的第j个比特位,j也相当于下标//注意下标都是从0开始的if (_bits[i] & (1 << j)){return true;}return false;
}
3. size、count
size用于返回位图一共有多少位,也就是非类型模板参数N的值
直接返回N就好
size_t size()
{return N;
}
count用于计算该位图中有多少位是1,返回值是位图中1的个数
统计二进制中1的个数的方法如下:
- 将原数 n 与 n - 1 进行与运算得到新的 n 。
- 判断 n 是否为0,若 n 不为0则继续进行第一步。
- 如此进行下去,直到 n 最终为0,此时该操作进行了几次就说明二进制中有多少个1。
因为该操作每进行一次就会消去二进制中最右边的1,如图:
size_t count()
{size_t count = 0;for (auto e : _bits){int num = e;while (num){num &= (num - 1);++count;}}return count;
}
4. any、none、all
any表示位图中只要有一个1那就返回true,否则返回false
判断方式比较简单,每一个整数的所有比特位,只要有一个为1,那该整数就肯定不等于0,所以,我们可以遍历所有整数,只要有一个整数不等于0,那就说明有1,返回true,否则所有整数都是0,没一个1,返回false
bool any()
{for (auto e : _bits){if (e != 0){return true;}}return false;;
}
none表示位图中如果全是0,没一个1那就返回true,否则返回false
其实和any是对立的,如果any为假,说明全为0,说明none为真,所以none中只需将any的结果取反后返回就好了。
bool none()
{return !any();
}
all表示,全为1返回true,否则返回false
判断过程分为两步:
- 先检查前n-1个整数的二进制是否为全1。
- 再检查最后一个整数的前N%32个比特位是否为全1。
需要注意的是,如果位图没有包含最后一个整数的全部比特位,那么最后一个整数的二进制无论如何都不会为全1,所以在判断最后一个整数时应该只判断位图所包含的比特位。
bool all()
{size_t n = _bits.size();//先检查前n-1个整数for (size_t i = 0; i < n - 1; i++){if (~_bits[i] != 0) //取反后不为全0,说明取反前不为全1return false;}//再检查最后一个整数的前N%32位for (size_t j = 0; j < N % 32; j++){if ((_bits[n - 1] & (1 << j)) == 0) //该位未被设置return false;}return true;
}
5. 打印函数
为了验证bitset
对象的正确性,我们可以编写一个自定义的打印函数,该函数将遍历bitset
中的每一位,并打印出其状态(0或1)。同时,这个函数还可以统计并返回bitset
中实际被设置(即值为1)的位的数量,并将这个数量与bitset
的模板参数(即预期的大小)进行比较,以确认bitset
的大小是否符合预期。
#include <iostream>
#include <bitset>
using namespace std;// 自定义打印函数,用于打印bitset并统计1的个数
template<size_t N>
void printAndVerifyBitset(const bitset<N>& bs) {size_t count = 0; // 用于统计1的个数cout << "Bitset: ";```cpp
//打印函数
void Print()
{int count = 0;size_t n = _bits.size();//先打印前n-1个整数for (size_t i = 0; i < n - 1; i++){for (size_t j = 0; j < 32; j++){if (_bits[i] & (1 << j)) //该位被设置std::cout << "1";else //该位未被设置std::cout << "0";count++;}}//再打印最后一个整数的前N%32位for (size_t j = 0; j < N % 32; j++){if (_bits[n - 1] & (1 << j)) //该位被设置std::cout << "1";else //该位未被设置std::cout << "0";count++;}std::cout << " " << count << std::endl; //打印总共打印的位的个数
}
三、完整代码
#pragma once
#include <iostream>
#include <vector>
#include <assert.h>
namespace qi
{template <size_t N>class bitset{private:std::vector<int> _bits;public:bitset(){_bits.resize(N / 32 + 1, 0);}void set(size_t pos){assert(pos < N);int i = pos / 32;int j = pos % 32;_bits[i] |= (1 << j);}void reset(size_t pos){assert(pos < N);int i = pos / 32;int j = pos % 32;_bits[i] &= (~(1 << j));}void flip(size_t pos){assert(pos < N);int i = pos / 32;int j = pos % 32;_bits[i] ^= (1 << j);}size_t size(){return N;}size_t count(){size_t count = 0;for (auto e : _bits){int num = e;while (num){num &= (num - 1);++count;}}return count;}bool test(size_t pos){assert(pos < N);int i = pos / 32;int j = pos % 32;if (_bits[i] & (1 << j)){return true;}return false;}bool any(){for (auto e : _bits){if (e != 0){return true;}}return false;;}bool none(){return !any();}bool all(){size_t n = _bits.size();for (int i = 0; i < n - 1; i++){if (~_bits[i] != 0){return false;}}for(int i = 0; i < N % 32; i++){if ((_bits[n - 1] & (1 << i)) == 0) //该位未被设置return false;}return true;}//打印函数void Print(){int count = 0;size_t n = _bits.size();//先打印前n-1个整数for (size_t i = 0; i < n - 1; i++){for (size_t j = 0; j < 32; j++){if (_bits[i] & (1 << j)) //该位被设置std::cout << "1";else //该位未被设置std::cout << "0";count++;}}//再打印最后一个整数的前N%32位for (size_t j = 0; j < N % 32; j++){if (_bits[n - 1] & (1 << j)) //该位被设置std::cout << "1";else //该位未被设置std::cout << "0";count++;}std::cout << " " << count << std::endl; //打印总共打印的位的个数}};
}
相关文章:

C++ bitset(位图)的模拟实现
文章目录 一、bitset接口总览二、bitset模拟实现1. 构造函数2. set、reset、flip、test3. size、count4. any、none、all5. 打印函数 三、完整代码 一、bitset接口总览 成员函数功能set设置指定位或所有位为1(即设置为“已设置”状态)reset清空指定位或…...

Llama 3.2:利用开放、可定制的模型实现边缘人工智能和视觉革命
在我们发布 Llama 3.1 模型群后的两个月内,包括 405B - 第一个开放的前沿级人工智能模型在内,它们所产生的影响令我们兴奋不已。 虽然这些模型非常强大,但我们也认识到,使用它们进行构建需要大量的计算资源和专业知识。 我们也听到…...

解决R语言bug ‘sh‘ is not recognized as an internal or external command
安装源码包‘httr2’ trying URL ‘https://cran.rstudio.com/src/contrib/httr2_1.0.5.tar.gz’ Content type ‘application/x-gzip’ length 230632 bytes (225 KB) downloaded 225 KB installing source package ‘httr2’ … ** package ‘httr2’ successfully unpacked…...

记一次Mac 匪夷所思终端常用网络命令恢复记录
一天莫名奇妙发现ping dig 等基础命令都无法正常使用。还好能浏览器能正常访问,,,, 赶紧拿baidu试试^-^ ; <<>> DiG 9.10.6 <<>> baidu.com ;; global options: cmd ;; connection timed out; no serve…...

2024最新!!Java后端面试题(4)看这一篇就够了!!!!
七、异常 throw 和 throws 的区别? throw用来显式地抛出一个异常,而throws则用于在方法声明中指明该方法可能抛出的异常。简单来说,throw是抛出异常的实际动作,throws是告知调用者这个方法可能会抛出哪些异常的声明。 final、f…...

springboot整合sentinel和对feign熔断降级
一、准备 docker安装好sentinel-dashboard(sentinel控制台),参考docker安装好各个组件的命令启动sentinel-dashboard,我的虚拟机ip为192.168.200.131,sentinel-dashboard的端口为8858 二、整合sentinel的主要工作 在…...

遗传算法与深度学习实战——使用进化策略实现EvoLisa
遗传算法与深度学习实战——使用进化策略实现EvoLisa 0. 前言1. 使用进化策略实现 EvoLisa2. 运行结果相关链接 0. 前言 我们已经学习了进化策略 (Evolutionary Strategies, ES) 的基本原理,并且尝试使用 ES 解决了函数逼近问题。函数逼近是一个很好的基准问题&…...

HttpServletRequest简介
HttpServletRequest是什么? HttpServletRequest是一个接口,其父接口是ServletRequest;HttpServletRequest是Tomcat将请求报文转换封装而来的对象,在Tomcat调用service方法时传入;HttpServletRequest代表客户端发来的请…...

c++开发之编译curl(安卓版本)
为了在 Android 上编译支持 OpenSSL 的 libcurl,你需要手动编译 libcurl 和 OpenSSL,并确保它们能够在 Android 的交叉编译环境中正常工作。以下是详细的步骤说明。 1. 安装必要工具 在编译之前,确保你已经安装了以下工具: And…...

QT+ESP8266+STM32项目构建三部曲三--QT从环境配置到源程序的解析
一、阿里云环境配置 大家在编写QT连接阿里云的程序之前,先按照下面这篇文章让消息可以在阿里云上顺利流转 QTESP8266STM32项目构建三部曲二--阿里云云端处理之云产品流转-CSDN博客文章浏览阅读485次,点赞7次,收藏4次。创建两个设备ÿ…...

Web APIs 5:Window对象(BOM)+本地存储
Web APIs 5(BOM:Window对象本地存储) 1.BOM(浏览器对象模型)(后面几个对象都为BOM对象) BOM对象包含:navigator、location、document(DOM对象)、history、screenBOM是一个全局对象,即JS中的顶…...

神经网络(四):UNet图像分割网络
文章目录 一、简介二、网络结构2.1编码器部分2.2解码器部分2.3完整代码 三、实战案例 论文链接:点击跳转 一、简介 UNet网络是一种用于图像分割的卷积神经网络,其特点是采用了U型网络结构,因此称为UNet。该网络具有编码器和解码器结构&#…...

Java 编码系列:注解处理器详解与面试题解析
引言 在上一篇文章中,我们详细探讨了 Java 注解的基本概念、自定义注解、元注解等技术。本文将继续深入探讨 Java 注解处理器(Annotation Processor),介绍如何编写注解处理器,并结合大厂的最佳实践和面试题详细解析其…...

C语言 | Leetcode C语言题解之第441题排列硬币
题目: 题解: class Solution { public:int arrangeCoins(int n) {return (int) ((sqrt((long long) 8 * n 1) - 1) / 2);} };...

Linux noVNC远程桌面(xfce)部署
一、安装 VNC 服务器和桌面环境 Notebook实验 常用vnc服务 VNC (Virtual Network Computing) 是一种远程桌面协议,可以让你通过网络访问服务器的图形界面。 TurboVNC:专为图形密集型应用设计,尤其适合 3D 可视化和高分辨率图像的远程传输…...

【网络安全】身份认证
1. 身份认证 1.1 定义 身份认证(Authentication)是确认用户身份的过程,确保只有授权的用户才能访问系统或资源。它通常涉及验证用户提供的凭证,如密码、生物特征或其他识别标志。 1.2 重要性 身份认证是信息安全的第一道防线&…...

LeetCode - #124 二叉树中的最大路径和(Top 100)
文章目录 前言1. 描述2. 示例3. 答案关于我们前言 本题为 LeetCode 前 100 高频题 我们社区陆续会将顾毅(Netflix 增长黑客,《iOS 面试之道》作者,ACE 职业健身教练。)的 Swift 算法题题解整理为文字版以方便大家学习与阅读。 LeetCode 算法到目前我们已经更新到 123 期…...

Java:插入排序
目录 排序的概念 插入排序 直接插入排序 哈希排序 排序的概念 排序:所谓的排序,就是使一串记录,按照某个或某些关键字的大小,递增或递减的排列起来的操作。 稳定性:假定在待排序的记录序列中,存在多个…...

How FAR ARE WE FROM AGI?(ICLR AGI Workshop 2024)概览
关注B站可以观看更多实战教学视频:hallo128的个人空间 How FAR ARE WE FROM AGI?官网 How FAR ARE WE FROM AGI?(ICLR AGI Workshop 2024) 该研讨会将于2024年5月11日在奥地利维也纳以混合模式举行,作为 ICLR 2024年会议的一部…...

leetcode刷题day33|动态规划Part02(62.不同路径、63. 不同路径 II、 343.整数拆分、96.不同的二叉搜索树)
62.不同路径 机器人从(0 , 0) 位置出发,到(m - 1, n - 1)终点。 动规五部曲 1、确定dp数组(dp table)以及下标的含义 dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路…...

基于Python大数据的B站热门视频的数据分析及可视化系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏:Java精选实战项目…...

matlab-批处理图像质量变化并形成折线图 (PSNR)
%修改路径就能用,图片分辨率要一致 %clc;clear all;close all;tic;%清理内存 file_pathE:\test\resources\image\;% 批量图像所在的文件夹下 file_save_pathE:\test\resources\SaveImage\;% 要存储的地址 img_path_listdir(strcat(file_path,*.jpg));% 获取批量bm…...

[Doc][Ros2]ros2中Qos(Quality of Service,服务质量)介绍
在 ROS 2 中,QoS(Quality of Service,服务质量)是用于控制节点之间消息传递的可靠性、历史存储和数据持久性等方面的机制。通过 QoS 设置,用户可以更细粒度地控制消息传递的行为,确保在不同网络环境或应用场景中满足特定的通信需求。 几个常用的包: QoSProfile: 含义…...

SpringBoot日志集成-LogBack
Log4J:最早的Java日志框架之一,由Apache基金会发起,提供灵活而强大的日志记录机制JDK自带的日志框架:java.util.logging.Logg,是JDK1.4之后提供的日志API,已淘汰logback: logback一个开源的日志…...

Google BigTable架构详解
文章目录 什么是BigTable?架构图一、整体架构二、数据存储与索引存储模型 三、数据拆分与存储四、元数据管理五、读写流程 其他内容概览负载平衡其他存储和数据库选项 什么是BigTable? Bigtable是Google开发的一个高性能、可扩展的分布式存储系统,用于管理大规模…...

【python】如何切换ipynb的kernel至指定conda环境
需求介绍 打开(若无新建环境) 环境 conda env list conda activate cvml conda install ipykernel python -m ipykernel install --name cvml 以上完成后,打开jupyter 创建一个python文件 在kernel——>change kernel——>python[conda env:cvml] 参考资料…...

Linux【基础指令汇总】
目录 Linux命令的特点 1、文件管理 ls命令 cp命令 mkdir命令 mv命令 pwd命令 2、文档编辑 cat命令 echo命令 rm命令 tail命令 rmdir命令 3、系统管理 rpm命令 find命令 startx命令 uname命令 vmstat命令 4、磁盘管理 df命令 fdisk命令 lsblk命令 hdpar…...

SpringCloud-EurekaClient
创建Module pom.xml <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency> spring:application:name: provider # 应用程序的名称,…...

配置Scrapy项目
配置Scrapy项目是一个涉及多个步骤的过程,在上一篇博客中已经写了安装Scrapy、创建Scrapy项目的步骤。 接下来应该定义Item类、编写爬虫程序以及配置settings.py文件等。以下是一个详细的配置Scrapy项目的步骤: 一、定义Item类 在项目目录下…...

航顺芯片HK32MCU受邀出席汽车芯片国产化与技术创新闭门研讨会
[中国,北京,2024年9月21日]近日,深圳市航顺芯片技术研发有限公司(以下简称“航顺芯片”)产品总监郑增忠受邀出席由中国设备管理协会新能源汽车产业发展促进中心主办的“汽车芯片国产化与技术创新闭门研讨会”。 会上航…...