C++ 获取位域成员的位宽

C++ 中可以使用位域来节省内存,实现不同长度的数据的存放,例如:

struct BF {uint32_t a1 : 4;uint32_t a2 : 5;uint32_t a3 : 6;
} bf;

结构体变量 bf 大小为 2 Byte,其成员变量 a1, a2, a3 分别占 4, 5, 6 位二进制,一共是 15 位 二进制,按照字节对齐,因此一个结构体变量 bf 占 2 字节。

C++ 支持这样的自定义数据结构,但是没有提供获取结构体变量 bf 的每个成员所占位宽的方法。

这里给出一种利用数据类型溢出的方法来获取这样的结构体的成员变量的位宽的方法:

以上面的结构体类型 BF 为例,它的成员变量都是无符号类型。由于无符号类型无法表示负数,当将无符号类型变量的值减小成负数的时候,就会发生溢出:

uint32_t a = 0;
a -= 1;		// 此时由于无符号类型变量 a 变成了 -1, 但是无符号类型的范围不包含 -1,即此时 a 发生了溢出,由 uint32_t 的表示范围知道,此时溢出的 a 的值是 (1 >> 32) - 1,即 a 此时的值是 32 为全 1 二进制数,此时只需要计算出 a 的 1 的个数即可得到 a 的位宽

将上面的方法用在 bf 上就有:

int len_a1 = bitset<64>(bf.a1 - (bf.a1 + 1)).count();	// 4
int len_a2 = bitset<64>(bf.a2 - (bf.a2 + 1)).count();	// 5
int len_a3 = bitset<64>(bf.a3 - (bf.a3 + 1)).count();	// 6

–> 上面的方法不仅适用于无符号类型的位域成员,对于有符号类型的位域成员也可以使用类似的方法,是需要改变是位域成员溢出为该类型最大整数的方法即可。

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

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

相关文章

ApsaraMQ Serverless 演进之路,助力企业降本

作者&#xff1a;家泽 ApsaraMQ 与时俱进&#xff0c;砥砺前行 阿里云消息队列从诞生开始&#xff0c;至今已有十余年。今年&#xff0c;阿里云消息产品全面品牌升级为 ApsaraMQ&#xff0c;与时俱进&#xff0c;砥砺前行。 2012 年&#xff0c;RocketMQ 诞生于集团内部&…

测试理论知识八:敏捷开发测试、极限编程测试

1. 敏捷开发模式下的测试 敏捷开发的核心理念&#xff1a; 个体和互动高于流程和工具。 工作的软件高于详尽的文档。 客户合作高于合同谈判。 响应变化高于遵循计划。 2. 敏捷开发的特征 敏捷开发提倡迭代式和增量式的开发模式&#xff0c;并强调测试在其中的重要作用。这…

【Linux系统基础】(4)在Linux上部署Tomcat、Nginx软件

Tomcat安装部署【简单】 简介 Tomcat 是由 Apache 开发的一个 Servlet 容器&#xff0c;实现了对 Servlet 和 JSP 的支持&#xff0c;并提供了作为Web服务器的一些特有功能&#xff0c;如Tomcat管理和控制平台、安全域管理和Tomcat阀等。 简单来说&#xff0c;Tomcat是一个W…

锐捷ssh配置

配置实例 ssh-Server ssh-Server(config)#enable service ssh-server // 启用ssh服务 ssh-Server(config)#username admin privilege 15 password Test123456 // 设置ssh登陆的账户密码 ssh-Server(config)#line vty 0 4 ssh-Server(config-line)#transport input ssh …

线性回归简介

线性回归简介 1、情景描述2、线性回归 1、情景描述 假设&#xff0c;我们现在有这么一张图&#xff1a; 其中&#xff0c;横坐标x表示房子的面积&#xff0c;纵坐标y表示房价。我们猜想x与y之间存在线性关系&#xff1a; y k x b ykxb ykxb 现在&#xff0c;思考一个问题&…

Java final、finally、finalize 有什么区别?

Java final、finally、finalize 有什么区别&#xff1f; final、finally 和 finalize 是 Java 中三个完全不同的概念&#xff0c;分别用于修饰变量、定义异常处理块和垃圾回收。 final&#xff1a; final 是一个关键字&#xff0c;用于修饰类、方法、变量等。被 final 修饰的…

安徽省人民政府关于印发《打造通用人工智能产业创新和应用高地若干政策》通知

安徽省人民政府关于印发《打造通用人工智能产业创新和应用高地若干政策》通知 原文地址 各市、县人民政府&#xff0c;省政府各部门、各直属机构&#xff1a; 现将《打造通用人工智能产业创新和应用高地若干政策》印发给你们&#xff0c;请认真贯彻落实。 安徽省人民政府 2…

纯HTML代码实现给图片增加水印并下载保存到本地

<!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1, maximum-scale1, user-scalableno"/><title>图片水印打码工具-宋佳乐博客</tit…

计算机图形学理论(3):着色器编程

本系列根据国外一个图形小哥的讲解为本&#xff0c;整合互联网的一些资料&#xff0c;结合自己的一些理解。 CPU vs GPU CPU支持&#xff1a; 快速缓存分支适应性高性能 GPU支持&#xff1a; 多个 ALU快速板载内存并行任务的高吞吐量&#xff08;在每个片段、顶点上执行着色…

nn.Embedding()个人记录

维度 import torch.nn as nnembedding nn.Embedding(num_embeddings 10, embedding_dim 256) nn.Embedding()随机产生一个权重矩阵weight&#xff0c;维度为&#xff08;num_embeddings, embedding_dim&#xff09; 输入维度&#xff08;batch_size, Seq_len&#xff09…

winlogbeat收集Windows事件日志传给ELK

服务器部署winlogbeat后&#xff0c;修改winlogbeat.yml: ###################### Winlogbeat Configuration Example ######################### This file is an example configuration file highlighting only the most common # options. The winlogbeat.reference.yml fi…

基于Java+SpringBoot+MyBatis-plus+Vue前后端分离小区管理系统设计与实现2.0

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

力扣日记12.24-【二叉树篇】236. 二叉树的最近公共祖先

力扣日记&#xff1a;【二叉树篇】236. 二叉树的最近公共祖先 日期&#xff1a;2023.12.24 参考&#xff1a;代码随想录、力扣 ps&#xff1a;提前祝 平安夜快乐&#xff01; 236. 二叉树的最近公共祖先 题目描述 难度&#xff1a;中等 给定一个二叉树, 找到该树中两个指定节点…

linux线程取消, pthread线程取消,pthread_testcancel用法

pthread_cancel Linux中&#xff0c;线程在运行时如果想要取消&#xff0c;一种方法是调用pthread_cancel()函数&#xff0c;它的原型是&#xff1a; /* Cancel THREAD immediately or at the next possibility. */ extern int pthread_cancel (pthread_t __th); 参数pthre…

Python连接数据库

文章目录 一、安装mysql二、SQLyog可视化操作三、python实现数据库单表类封装1. config 文件——config.py2. 封装类&#xff08;model&#xff09;——model.py3. 测试文件——test.py 一、安装mysql 官网安装&#xff0c;或者Windows64位直接在我的资源里面上传了mysql&…

【PostgreSQL】从零开始:(二十七)数据类型-UUID 类型

UUID 类型 UUID&#xff08;通用唯一标识符&#xff09;是一个128位的数字标识符&#xff0c;用于在计算机系统中唯一地标识实体。它的标准格式为32个十六进制数字&#xff0c;用连字符分隔成五个组&#xff0c;形式如&#xff1a;8-4-4-4-12。UUID在各种系统和平台上广泛使用…

华为OD机试 - 测试用例执行计划(Java JS Python C)

题目描述 某个产品当前迭代周期内有 N 个特性(F1,F2,......FN)需要进行覆盖测试,每个特性都被评估了对应的优先级,特性使用其 ID 作为下标进行标识。 设计了 M 个测试用例(T1,T2,......,TM),每个测试用例对应一个覆盖特性的集合,测试用例使用其 ID 作为下标进行标识,…

C/C++ 基础函数

memcpy&#xff1a;C/C语言中的一个用于内存复制的函数&#xff0c;声明在 string.h 中&#xff08;C是 cstring&#xff09; void *memcpy(void *destin, void *source, unsigned n);作用是&#xff1a;以source指向的地址为起点&#xff0c;将连续的n个字节数据&#xff0c;…

Acwing 周赛135 题解

A&#xff1a;https://www.acwing.com/problem/content/5378/ 思路&#xff1a;签到题&#xff0c;输出n/x即可。 代码&#xff1a; #include<bits/stdc.h> using namespace std; #define rep(i,a,b) for(int i(a);i<(b);i) #define lop(i,a,b) for(int i(a);i<…

Linux: config: CONFIG_NODES_SHIFT;numa;强制挂钩

文章目录 简介config NODES_SHIFT循环接口简介 node和numa算是强挂钩关系了。和node相关的,几乎全部是numa。所以不要疑惑node和numa的强关联性。 config NODES_SHIFT Redhat提供的是10,也就是支持1024个node,但实际上用不了这么多,但是为了通用性,设置了这么大,其实可…