当前位置: 首页 > news >正文

标准库标头 <bit>(C++20)学习

<bit>头文件是数值库的一部分。定义用于访问、操作和处理各个位和位序列的函数。例如,有函数可以旋转位、查找连续集或已清除位的数量、查看某个数是否为 2 的整数幂、查找表示数字的最小位数等。

类型

endian

(C++20)

指示标量类型的端序
(枚举)

函数

bit_cast

(C++20)

将一个类型的对象表示重解释为另一类型的对象表示
(函数模板)

byteswap

(C++23)

反转给定整数值中的字节
(函数模板)

has_single_bit

(C++20)

检查一个数是否为 2 的整数次幂
(函数模板)

bit_ceil

(C++20)

寻找不小于给定值的最小的二的整数次幂
(函数模板)

bit_floor

(C++20)

寻找不大于给定值的最大的二的整数次幂
(函数模板)

bit_width

(C++20)

寻找表示给定值所需的最小位数
(函数模板)

rotl

(C++20)

计算逐位左旋转的结果
(函数模板)

rotr

(C++20)

计算逐位右旋转的结果
(函数模板)

countl_zero

(C++20)

从最高位起计量连续的 0 位的数量
(函数模板)

countl_one

(C++20)

从最高位起计量连续的 1 位的数量
(函数模板)

countr_zero

(C++20)

从最低位起计量连续的 0 位的数量
(函数模板)

countr_one

(C++20)

从最低位起计量连续的 1 位的数量
(函数模板)

popcount

(C++20)

计量无符号整数中为 1 的位的数量
(函数模板)

下面来看一下它的具体使用示例:

endian判断CPU的大小端序

#include <bit>
#include <iostream>//检测处理器端序,返回值:0表大端序,1表示小端序
//小端序低位存放低地址,例如:16bit的数0x1234在小端序模式CPU内存中的存放方式(假设从地址0x2000开始存放)为
//0x2000     0x34
//0x2001     0x12
int checkCPUendian()
{union w{int a;char b;}c;c.a = 1;return (c.b == 1);
}int main()
{if constexpr (std::endian::native == std::endian::big)std::cout << "大端\n";else if constexpr (std::endian::native == std::endian::little)std::cout << "小端\n";elsestd::cout << "混合端序\n";int ret = checkCPUendian();std::cout << "ret======" << ret << std::endl;if (ret)std::cout << "CPU为小端序\n";elsestd::cout << "CPU为大端序\n";return 0;
}

运行结果:

运行的时候要把编译器设置为C++20或最新的c++标准

 函数示例:

#include <bit>
#include <concepts>
#include <cstdint>
#include <iomanip>
#include <iostream>
#include <bitset>
#include <cmath>template <std::integral T>
void dump(T v, char term = '\n')
{std::cout << std::hex << std::uppercase << std::setfill('0')<< std::setw(sizeof(T) * 2) << v << " : ";for (std::size_t i{}; i != sizeof(T); ++i, v >>= 8)std::cout << std::setw(2) << static_cast<unsigned>(T(0xFF) & v) << ' ';std::cout << std::dec << term;
}static_assert(std::popcount(0xFULL) == 4);int main()
{//1.bit_cast example 将一个类型的对象表示重解释为另一类型的对象表示 float f = std::numeric_limits<float>::infinity();int i = std::bit_cast<int>(f);std::cout << "float f = " << std::hex << f<< "\nstd::bit_cast<int>(f) = " << std::hex << i << '\n';//2.byteswap example反转给定整数值中的字节 static_assert(std::byteswap('a') == 'a');std::cout << "U16 的 byteswap:\n";constexpr auto x = std::uint16_t(0xCAFE);dump(x);dump(std::byteswap(x));std::cout << "\nU32 的 byteswap:\n";constexpr auto y = std::uint32_t(0xDEADBEEFu);dump(y);dump(std::byteswap(y));std::cout << "\nU64 的 byteswap:\n";constexpr auto z = std::uint64_t{ 0x0123456789ABCDEFull };dump(z);dump(std::byteswap(z));//3.has_single_bit example检查一个数是否为 2 的整数次幂for (auto u = 0u; u != 10; ++u){std::cout << "u = " << u << " = " << std::bitset<4>(u);if (std::has_single_bit(u)) // P1956R1 前为 `ispow2`std::cout << " = 2^" << std::log2(u) << " (为二的幂)";std::cout << '\n';}//4.bit_ceil example寻找不小于给定值的最小的二的整数次幂using bin = std::bitset<8>;for (unsigned x{ 0 }; x != 10; ++x){unsigned const z = std::bit_ceil(x); // P1956R1 前为 `ceil2`std::cout << "bit_ceil( " << bin(x) << " ) = " << bin(z) << '\n';}//5.bit_floor example寻找不大于给定值的最大的二的整数次幂using bin = std::bitset<8>;for (unsigned x = 0; x != 10; ++x){auto const z = std::bit_floor(x); // P1956R1 前为 `floor2`std::cout << "bit_floor( " << bin(x) << " ) = " << bin(z) << '\n';}//6.bit_width example寻找表示给定值所需的最小位数for (unsigned x{ 0 }; x != 8; ++x){std::cout << "bit_width( "<< std::bitset<4>{x} << " ) = "<< std::bit_width(x) << '\n';}//7.rotl example计算逐位左旋转的结果std::uint8_t i7 = 0b00011101;std::cout << "i7          = " << std::bitset<8>(i7) << '\n';std::cout << "rotl(i7,0)  = " << std::bitset<8>(std::rotl(i7, 0)) << '\n';std::cout << "rotl(i7,1)  = " << std::bitset<8>(std::rotl(i7, 1)) << '\n';std::cout << "rotl(i7,4)  = " << std::bitset<8>(std::rotl(i7, 4)) << '\n';std::cout << "rotl(i7,9)  = " << std::bitset<8>(std::rotl(i7, 9)) << '\n';std::cout << "rotl(i7,-1) = " << std::bitset<8>(std::rotl(i7, -1)) << '\n';//8.rotr example计算逐位右旋转的结果std::uint8_t i8 = 0b00011101;std::cout << "i8          = " << std::bitset<8>(i8) << '\n';std::cout << "rotr(i8,0)  = " << std::bitset<8>(std::rotr(i8, 0)) << '\n';std::cout << "rotr(i8,1)  = " << std::bitset<8>(std::rotr(i8, 1)) << '\n';std::cout << "rotr(i8,9)  = " << std::bitset<8>(std::rotr(i8, 9)) << '\n';std::cout << "rotr(i8,-1) = " << std::bitset<8>(std::rotr(i8, -1)) << '\n';//9.countl_zero example从最高位起计量连续的 0 位的数量for (const std::uint8_t i : {0, 0b11111111, 0b11110000, 0b00011110})std::cout << "countl_zero( " << std::bitset<8>(i) << " ) = "<< std::countl_zero(i) << '\n';//10.countl_one example从最高位起计量连续的 1 位的数量for (const std::uint8_t i : {0, 0b11111111, 0b01111111, 0b11100011})std::cout << "countl_one( " << std::bitset<8>(i) << " ) = "<< std::countl_one(i) << '\n';//11.countr_zero example从最低位起计量连续的 0 位的数量for (const std::uint8_t i : {0, 0b11111111, 0b00011100, 0b00011101})std::cout << "countr_zero( " << std::bitset<8>(i) << " ) = "<< std::countr_zero(i) << '\n';//12.countr_one example从最低位起计量连续的 1 位的数量for (const std::uint8_t i : {0, 0b11111111, 0b11111110, 0b11100011})std::cout << "countr_one( " << std::bitset<8>(i) << " ) = "<< std::countr_one(i) << '\n';//13.popcount example计量无符号整数中为 1 的位的数量for (const std::uint8_t x : {0, 0b00011101, 0b11111111})std::cout << "popcount( " << std::bitset<8>(x) << " ) = "<< std::popcount(x) << '\n';return 0;
}

运行结果:

参考

https://learn.microsoft.com/zh-cn/cpp/standard-library/bit-functions?view=msvc-170#bit_cast
https://zh.cppreference.com/w/cpp/header/bit

相关文章:

标准库标头 <bit>(C++20)学习

<bit>头文件是数值库的一部分。定义用于访问、操作和处理各个位和位序列的函数。例如&#xff0c;有函数可以旋转位、查找连续集或已清除位的数量、查看某个数是否为 2 的整数幂、查找表示数字的最小位数等。 类型 endian (C20) 指示标量类型的端序 (枚举) 函数 bit_ca…...

redis群集三种模式:主从复制、哨兵、集群

redis群集有三种模式 redis群集有三种模式&#xff0c;分别是主从同步/复制、哨兵模式、Cluster&#xff0c;下面会讲解一下三种模式的工作方式&#xff0c;以及如何搭建cluster群集 ●主从复制&#xff1a;主从复制是高可用Redis的基础&#xff0c;哨兵和集群都是在主从复制…...

【MATLAB源码-第225期】基于matlab的计算器GUI设计仿真,能够实现基础运算,三角函数以及幂运算

操作环境&#xff1a; MATLAB 2022a 1、算法描述 界面布局 计算器界面的主要元素分为几大部分&#xff1a;显示屏、功能按钮、数字按钮和操作符按钮。 显示屏 显示屏&#xff08;Edit Text&#xff09;&#xff1a;位于界面顶部中央&#xff0c;用于显示用户输入的表达式和…...

基于yolov8的红外小目标无人机飞鸟检测系统python源码+onnx模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv8的红外小目标无人机与飞鸟检测系统是一项集成了前沿技术的创新解决方案。该系统利用YOLOv8深度学习模型的强大目标检测能力&#xff0c;结合红外成像技术&#xff0c;实现了对小型无人机和飞鸟等低空飞行目标的快速、准确检测。 YOLOv8作为YOLO系列的…...

网络封装分用

目录 1,交换机 2,IP 3,接口号 4,协议 分层协议的好处: 5,OSI七层网络模型. 6,TCP/IP五层网络模型(主流): [站在发送方视角] [接收方视角] 1,交换机 交换机和IP没有关系,相当于是对路由器接口的扩充,这时相当于主机都与路由器相连处于局域网中,把越来越多的路由器连接起…...

【Finetune】(一)、transformers之BitFit微调

文章目录 0、参数微调简介1、常见的微调方法2、代码实战2.1、导包2.2、加载数据集2.3、数据集处理2.4、创建模型2.5、BitFit微调*2.6、配置模型参数2.7、创建训练器2.8、模型训练2.9、模型推理 0、参数微调简介 参数微调方法是仅对模型的一小部分的参数&#xff08;这一小部分可…...

ubuntu24系统普通用户免密切换到root用户

普通用户登录系统后需要切换到root用户&#xff0c;这边需要密码&#xff0c;现在不想让用户知道密码是多少。 sudo: 1 incorrect password attempt $ su - Password: root-security-cm5:~#开始配置普通用户免密切换到root用户&#xff0c;编辑配置文件 /etc/sudoers 最后增加…...

如何应对pcdn技术中遇到的网络安全问题?

在应对网络安全问题时&#xff0c;需要采取一系列的操作措施&#xff0c;以确保网络环境的稳定性和数据的安全性。以下是一些建议&#xff1a; 选择可靠的PCDN提供商&#xff1a;与有良好安全记录的PCDN提供商合作&#xff0c;确保提供商具备专业的安全团队&#xff0c;能够提…...

【WRF工具】WRF Domain Wizard第一期:软件下载及安装

【WRF工具介绍】WRF Domain Wizard下载及安装 1 WRF Domain Wizard 的主要功能2 使用 WRF Domain Wizard 的步骤2.1 安装 WRF Domain Wizard&#xff1a;2.2 启动 WRF Domain Wizard&#xff1a;2.3 定义计算域&#xff1a;2.4 生成配置文件&#xff1a;2.5 运行 WPS 和 WRF&am…...

使用CUBE_MX实现STM32 DMA功能 (储存器发送数据到外设串口)+(外设串口将数据写入到存储器)

目录 一、配置串口打印&#xff08;参考串口打印的文章&#xff09; 二、CUBE_MX配置 三、KEIL5配置 1.打开dma.c文件&#xff08;默认初始化DMA中断函数&#xff09; 2.打开usart.c文件 3.打开main.c文件&#xff08;储存器发送数据到外设串口&#xff09; 4.打开main.c…...

【JavaScript】数据结构之树

什么是树形结构&#xff1f; 一种分层数据的抽象模型&#xff0c;用来分层级关系的。虚拟dom它所组织的那个数据原理就是树形结构 深度优先搜索&#xff08;遍历&#xff09;- 递归 从根出发&#xff0c;尽可能深的搜索树的节点技巧 访问根节点对根节点的children挨个进行深…...

【AI大模型】LLM主流开源大模型介绍

目录 &#x1f354; LLM主流大模型类别 &#x1f354; ChatGLM-6B模型 2.1 训练目标 2.2 模型结构 2.3 模型配置(6B) 2.4 硬件要求 2.5 模型特点 2.6 衍生应用 &#x1f354; LLaMA模型 3.1 训练目标 3.2 模型结构 3.3 模型配置&#xff08;7B&#xff09; 3.4 硬件…...

Uniapp的alertDialog返回值+async/await处理确定/取消问题

今天在使用uniui的alertDialog时&#xff0c;想添加一个确定/取消的警告框时 发现alertDialog和下面的处理同步进行了&#xff0c;没有等待alaertDialog处理完才进行 查询后发现问题在于 await 关键字虽然被用来等待 alertDialog.value.open() 的完成&#xff0c;但是 alertDi…...

Spring Boot中的响应与分层解耦架构

Spring Boot中的响应与分层解耦架构 在Spring Boot框架中&#xff0c;响应与分层解耦架构是两个核心概念&#xff0c;它们共同促进了应用程序的高效性、可维护性和可扩展性。下面将详细探讨这两个方面&#xff0c;包括Spring Boot的响应机制、分层解耦的三层架构以及它们在实际…...

基于python+django+vue的图书管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于pythondjangovueMySQL的图…...

Oracle数据库安装与SQL*Plus使用

一、实验过程 1、安装完数据库服务器程序后&#xff0c;查看系统服务启动状况并截图。 2、启动 SOL Plus工具,分别以SYS用户和 SYSTEM用户登录数据库&#xff0c;并解锁scott用户&#xff0c;用scott用户登录。每次登录完成后用show user命令查看当前用户&#xff0c;并截图。…...

C#通过MXComponent与三菱PLC通信

1&#xff0c;MXComponent安装包与手册。 https://download.csdn.net/download/lingxiao16888/89767137 2&#xff0c;使用管理员权限打开MXComponent&#xff0c;并进行配置。 3&#xff0c;引用相应的类库。 //通信类库 ActUtlTypeLib.dll或者ActProgType.dll 注明&#x…...

深度学习实战91-利用时空特征融合模型的城市网络流量预测分析与应用

大家好,我是微学AI,今天给大家介绍一下深度学习实战91-利用时空特征融合模型的城市网络流量预测分析与应用。本文围绕基于时空特征融合的城市网络流量预测展开。介绍了城市网络流量预测的重要性和现实需求,以及时空特征融合模型,包括其原理和优势。然后展示所使用的数据集,…...

GlusterFS 分布式文件系统

一、GlusterFS 概述 1.1 什么是GlusterFS GlusterFS 是一个开源的分布式文件系统&#xff0c;它可以将多个存储服务器结合在一起&#xff0c;创建一个大的存储池&#xff0c;供客户端使用。它不需要单独的元数据服务器&#xff0c;这样可以提高系统的性能和可靠性。由于没有…...

论文学习笔记6:Relation-Aware Heterogeneous Graph Neural Network for Fraud Detection

文章目录 Abstract一、Introduction二、Preliminaries2.1Problem Definition2.2Related Works 三、Proposed Method3.1Model Architecture3.2Computation Graph Pre-process3.3Heterogeneous Propagation Abstract 欺诈检测是金融和社交媒体领域的一项重要数据挖掘任务。传统的…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

OPENCV形态学基础之二腐蚀

一.腐蚀的原理 (图1) 数学表达式&#xff1a;dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一&#xff0c;腐蚀跟膨胀属于反向操作&#xff0c;膨胀是把图像图像变大&#xff0c;而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

[论文阅读]TrustRAG: Enhancing Robustness and Trustworthiness in RAG

TrustRAG: Enhancing Robustness and Trustworthiness in RAG [2501.00879] TrustRAG: Enhancing Robustness and Trustworthiness in Retrieval-Augmented Generation 代码&#xff1a;HuichiZhou/TrustRAG: Code for "TrustRAG: Enhancing Robustness and Trustworthin…...

高考志愿填报管理系统---开发介绍

高考志愿填报管理系统是一款专为教育机构、学校和教师设计的学生信息管理和志愿填报辅助平台。系统基于Django框架开发&#xff0c;采用现代化的Web技术&#xff0c;为教育工作者提供高效、安全、便捷的学生管理解决方案。 ## &#x1f4cb; 系统概述 ### &#x1f3af; 系统定…...

内窥镜检查中基于提示的息肉分割|文献速递-深度学习医疗AI最新文献

Title 题目 Prompt-based polyp segmentation during endoscopy 内窥镜检查中基于提示的息肉分割 01 文献速递介绍 以下是对这段英文内容的中文翻译&#xff1a; ### 胃肠道癌症的发病率呈上升趋势&#xff0c;且有年轻化倾向&#xff08;Bray等人&#xff0c;2018&#x…...