C++17中std::byte的使用

news2024/11/29 2:44:26

      C++17中std::byte的定义如下:std::byte本质上代表一个字节的值

enum class byte : unsigned char {};

      与unsigned char一样,std::byte可以用来访问其它对象(对象表示)占用的原始内存(raw memory),但与unsigned char不同的是,它不是字符类型,也不是算术类型。std::byte模型只是位的集合,仅支持按位和比较操作

      函数std::is_integral_v<T>定义如下:判断T是不是整型,如T为整型,则返回true;如果T的类型为bool、char、char16_t、char32_t、wchar_t、short、int、long、long long,以及任何实现定义的扩展整数类型(any implementation-defined extended integer types),包括任何有符号、无符号、和cv限定的变体(cv-qualified variants),则返回true

template< class T >
inline constexpr bool is_integral_v = is_integral<T>::value;

      std::byte相关函数
      (1).std::to_integer<T>(std::byte):将std::byte对象转换为整型T,仅当is_integral_v<T>为true时有效;
      (2).左移:<<=, 等价于: b = (std::byte)b << (T)shift; 仅当is_integral_v<T(shift)>为true时有效;
      (3).左移:<<,等价于: std::byte(static_cast<unsigned int>(b) << (T)shift); 仅当is_integral_v<T(shift)>为true时有效;
      (4).右移:>>=, 等价于: b = (std::byte)b >> (T)shift; 仅当is_integral_v<T(shift)>为true时有效;
      (5).右移: >>, 等价于:std::byte(static_cast<unsigned int>(b) >> (T)shift); 仅当is_integral_v<T(shift)>为true时有效;
      (6).按位&=、|=、^=:等价于:l = l & r; l = l | r; l = l ^ r;
      (7).按位&、|、^、~:等价于:std::byte(static_cast<unsigned int>(l) | static_cast<unsigned int>(r));等

      注意
      (1).列表初始化(使用花括号初始化)是唯一可以直接初始化std::byte对象的方法
      (2).std::byte对象存储在栈上。
      (3).sizeof(std::byte)的大小总是1.
      (4).大多数时候std::byte位数是8,但在有些平台上可能不是。
      (5).用std::to_integer<>(std::byte)可以把std::byte转换为任意基本整数类型(bool、字符类型或者整数类型)。
      (6).std::byte没有定义输入和输出运算符,因此不得不把它转换为整数类型再进行I/O。

      以下为测试代码:

namespace {

std::ostream& operator<<(std::ostream& os, std::byte b)
{
	return os << std::bitset<8>(std::to_integer<int>(b));
}

} // namespace

int test_byte()
{
	// 注意:列表初始化(使用花括号初始化)是唯一可以直接初始化std::byte对象的方法
	std::byte b{ 66 };
	std::cout << b << "\n"; // 01000010

	std::byte b2 = b << 1;
	std::cout << b2 << "\n"; // 10000100
	b <<= 1;
	std::cout << b << "\n"; // 10000100

	std::byte b3 = b >> 1;
	std::cout << b3 << "\n"; // 01000010
	b >>= 1;
	std::cout << b << "\n"; // 01000010

	std::byte b4 = b | std::byte{ 0b11110000 };
	std::cout << b4 << "\n"; // 11110010
	b |= std::byte{ 0b11110000 };
	std::cout << b << "\n"; // 11110010

	b4 = b & std::byte{ 0b11110000 };
	std::cout << b4 << "\n"; // 11110000
	b &= std::byte{ 0b11110000 };
	std::cout << b << "\n"; // 11110000

	b4 = b ^ std::byte{ 0b11111111 };
	std::cout << b4 << "\n"; // 00001111
	b ^= std::byte{ 0b11111111 };
	std::cout << b << "\n"; // 00001111

	b4 = ~b;
	std::cout << b4 << "\n"; // 11110000

	std::byte b5;
	//std::cout << b5 << "\n"; // error: 如果没有初始化,std::byte对象的值是未定义的,因为它存储在栈上

	std::byte b6{};
	std::cout << b6 << "\n"; // 00000000

	std::cout << "sizeof std::byte: " << sizeof(std::byte) << "\n"; // sizeof std::byte: 1

	std::byte b7{ 0xFF };
	std::cout << std::to_integer<unsigned int>(b7) << ","
		<< std::to_integer<int>(b7) << ","
		<< static_cast<int>(std::to_integer<signed char>(b7)) << "\n"; // 255,255,-1

	return 0;
}

      执行结果如下图所示:

      GitHub:https://github.com/fengbingchun/Messy_Test

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

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

相关文章

基于springboot实现应急救援物资管理系统项目【项目源码】

基于springboot实现应急救援物资管理系统演示 JAVA简介 JavaScript是一种网络脚本语言&#xff0c;广泛运用于web应用开发&#xff0c;可以用来添加网页的格式动态效果&#xff0c;该语言不用进行预编译就直接运行&#xff0c;可以直接嵌入HTML语言中&#xff0c;写成js语言&a…

【H5 Canvas】【平面几何】特殊图形绘制(箭头/正多边/正多尖角形等)

文章目录 直线/弧线 箭头 直线/弧线 箭头 // startX,startY 起始坐标 // endX,endY 结束坐标 // angel 圆弧角度,取值[0&#xff0c;PI]; 0表示画直线箭头&#xff0c;否则画圆弧箭头 CanvasRenderingContext2D.prototype.drawArrow function(startX,startY,endX,endY,angel)…

Pinctrl子系统和GPIO子系统

Pinctrl子系统&#xff1a; 借助Princtr子系统来设置一个Pin的复用和电气属性&#xff1b; pinctrl子系统主要做的工作是&#xff1a;1. 获取设备树中的PIN信息&#xff1b;2.根据获取到的pin信息来设置的Pin的复用功能&#xff1b;3.根据获取到的pin信息去设置pin的电气特性…

C++ 通过SQLite实现命令行工具

本文介绍了一个基于 C、SQLite 和 Boost 库的简单交互式数据库操作 Shell。该 Shell 允许用户通过命令行输入执行各种数据库操作&#xff0c;包括添加、删除主机信息&#xff0c;设置主机到特定主机组&#xff0c;以及显示主机和主机组列表。通过调用 SQLite3 库实现数据库连接…

零基础学Linux内核:1、Linux源码组织架构

文章目录 前言一、Linux内核的特征二、Linux操作系统结构1.Linux在系统中的位置2.Linux内核的主要子系统3、Linux系统主要数据结构 三、linux内核源码组织1、下载Linux源码2、Linux版本号3、linux源码架构目录讲解 前言 这里将是我们从零开始学习Linux的第一节&#xff0c;这节…

python 基于opencv和face_recognition的人脸识别

python 基于opencv和face_recognition的人脸识别 代码如下&#xff1a; 使用一个photos存放你需要识别的照片&#xff0c;注意一个人一张就行 然后通过下面代码注册用户&#xff0c;之后启动程序&#xff0c;就会调用摄像头进行识别了。 AddPhoto(“发哥”, “./photos/fag…

京东APP在哪里找到如何申请价格保护查看购买商品价格保护情况的记录信息?

京东价格保护是一项优质售后服务&#xff0c;用户在京东购买商品后&#xff0c;如果该商品在保护期内降价&#xff0c;用户可以申请价格保护&#xff0c;京东将补差价或返还京豆。这项服务旨在保障用户权益&#xff0c;让用户在购买商品时更加安心。用户在购买商品后&#xff0…

python-opencv 人脸68点特征点检测

python-opencv 人脸68点特征点检测 不是很难&#xff0c;主要还是掉包&#xff0c;来看一下代码啊&#xff1a; # coding: utf-8 # 导包 import numpy as np import dlib import cv2class face_emotion(object):def __init__(self):# 人脸检测器对象&#xff0c;通过它拿到人…

2024年天津天狮学院专升本食品质量与安全专业《分析化学》考纲

2024年天津天狮学院食品质量与安全专业高职升本入学考试《分析化学》考试大纲 一、考试性质 《分析化学》专业课程考试是天津天狮学院食品质量与安全专业高职升本入学考试 的必考科目之一&#xff0c;其性质是考核学生是否达到了升入本科继续学习的要求而进行的选拔性考试。《…

JSP 条件动作标签之if标签详解

好 上文 JSP JSTL引入依赖并演示基础使用我们导入了 JSTL的JAR 并 演示了 IF标签的基础使用 本文 我们来说说 平时开发的常用标签 这里 我们需要先强调一下 常用标签 操作的全部都是域对象 首先 我们来看 条件动作标签 条件动作标签的特点是 依赖于某些域对象值 控制页面输出…

【机器学习 | 聚类】关于聚类最全评价方法大全,确定不收藏?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

队列实现栈VS栈实现队列

目录 【1】用队列实现栈 思路分析 ​ 易错总结 Queue.c&Queue.h手撕队列 声明栈MyStack 创建&初始化栈myStackCreate 压栈myStackPush 出栈&返回栈顶元素myStackPop 返回栈顶元素myStackTop 判断栈空否myStackEmpty 释放空间myStackFree MyStack总代码…

【LeetCode:828. 统计子串中的唯一字符 | 贡献法 乘法原理】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

YOLOv5小目标检测层

目录 一、原理 二、yaml配置文件 一、原理 小目标检测层,就是增加一个检测头,增加一层锚框,用来检测输入图像中像素较小的目标 二、yaml配置文件 # YOLOv5 🚀 by Ultralytics, GPL-3.0 license# Parameters nc: 3 # number of classes depth_multiple: 0.33 # model…

Matplotlib网格子图_Python数据分析与可视化

Matplotlib网格子图 plt.subplot()绘制子图调整子图之间的间隔plt.subplots创建网格 plt.subplot()绘制子图 若干彼此对齐的行列子图是常见的可视化任务&#xff0c;matplotlib拥有一些可以轻松创建它们的简便方法。最底层且最常用的方法是plt.subplot()。 这个函数在一个网格…

RocketMq 队列(MessageQueue)

RocketMq是阿里出品&#xff08;基于MetaQ&#xff09;的开源中间件&#xff0c;已捐赠给Apache基金会并成为Apache的顶级项目。基于java语言实现&#xff0c;十万级数据吞吐量&#xff0c;ms级处理速度&#xff0c;分布式架构&#xff0c;功能强大&#xff0c;扩展性强。 官方…

C++二分查找:统计点对的数目

本题其它解法 C双指针算法&#xff1a;统计点对的数目 本周推荐阅读 C二分算法&#xff1a;得到子序列的最少操作次数 本文涉及的基础知识点 二分查找算法合集 题目 给你一个无向图&#xff0c;无向图由整数 n &#xff0c;表示图中节点的数目&#xff0c;和 edges 组成…

赢麻了!义乌一个村有5000个网红,有人年收租就300万!

#义乌一村电商年成交额超300亿# ,在中国&#xff0c;电商行业的发展可谓是日新月异&#xff0c;而位于浙江省义乌市的江北下朱村&#xff0c;正是这股潮流的一个典型代表。这个村子&#xff0c;处处弥漫着“直播”的气息&#xff0c;仿佛每个人都在为这个新兴行业助力。 江北下…

openEuler Linux 部署 FineBi

openEuler Linux 部署 FineBi 部署环境 环境版本openEuler Linux22.03MySQL8.0.35JDK1.8FineBi6.0 环境准备 升级系统内核和软件 yum -y updatereboot安装常用工具软件 yum -y install vim tar net-tools 安装MySQL8 将 MySQL Yum 存储库添加到系统的存储库列表中 sudo…

【anaconda】numpy.dot 向量点乘小技巧

假设向量A[1,1], 向量B[2,3]。如果想知道他们的内积就可以输入如下代码: 当然&#xff0c;如果是两个列向量相乘&#xff0c;肯定是不对的 但是如果没有维度也一样可以求得内积&#xff0c;而且结果不会套在列表里