C/C++中关于位域的一些总结

2023-11-07

转载自: http://blog.csdn.net/xkjcf/article/details/7688528

由于信息存储时,可能只占一位或者几位二进制位,比如开关量,只需要占据一位即可。为了节省存储空间,并且处理简单, C语言提供了一种数据结构,称为“位域”。

       所谓“位域”是把一个字节的二进制位划分为不同区域,并指明每个域的名称和长度,允许程序按照域名来进行数据的操作。这样就使的利用一个字节的二进制位表示几个不同的数据对象成为可能。

       位域声明形式与结构声明形式相似,位域声明形式:

Struct 位域结构名

{

         类型说明符  位域名:位域长度;

         ……

}

        注:位域长度不应该大于该类型说明符对应的数据类型的位长度。

位域赋值:

typedef struct{
	unsigned int a:1;
	unsigned int b:3;
}M;                  //位域声明
M m;                 //位域变量声明
m.a=7;               //位域赋值
m.b=11;


 

每个包含N位的位域的值等于程序所赋值的二进制表示法的后N位所对应的值。

比如位域aN=1,而7=111B,那么经过赋值后a=1.那么m.a=7m.a=1的效果相同。

同理m.b经过赋值后b=3.

内存量的计算:

        一个位域必须存储在同一个字节中,不能跨两个字节,前一个字节剩下的位数不足以下一个域时,下一个域会从下一个字节从新开始,但是前一字节剩下的位无法再使用。

#include<iostream>
using namespace std;
typedef struct{
	unsigned int a:1;
	unsigned int b:31;                       //(1)
}M;
typedef struct{
	unsigned int a:1;
	unsigned int b:32;                       //(2)
}N;
int _tmain(int argc, _TCHAR* argv[])
{
	M m;
	N n;
	cout<<"size of unsigned int :"<<sizeof(unsigned int)<<endl;
	cout<<"size of M :"<<sizeof(M)<<endl;
	cout<<"size of N :"<<sizeof(N)<<endl;
	return 0;
}


 

说明:在我的环境中unsigned int4个字节的。

在(1)处和(2)出的位数是不同的。在M中由于声明一个Unsigned int后有32个位,正好满足M内部域声明的需要。但是N33位,声明一个unsigned int不足够使用,所以又再次扩展了一个32位。

 

补充一:在位域说明中,位域可以有意的使下一个位域从下一字节开始。

struct BitRegion
{ 
   unsigned	   int  a:4 
   unsigned    int  :0 /*空域*/ 
   unsigned    int  b:4 /*从下一单元开始存放*/ 
   unsigned    int  c:4 
};


 

可以有意的使下一个位域从与前一个位域间隔若干字节后开始。

struct BitRegin
{ 
    unsigned   int  a:1 
    unsigned   int  :2 /*该2位不能使用*/ 
    unsigned   int  b:3 
    unsigned   int  c:2 
};


 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C/C++中关于位域的一些总结 的相关文章

  • 如何读取文件中的数据,并将其传递给结构〜> C

    好的 我的主目录中有一个名为 Graduates txt 的文件 我有一个便携式程序来查找主目录 然后我打开该文件进行读取 文件中的数据看起来像这样 year firstName lastName 我需要从该文件中获取这些数据 并将其分离到
  • 返回结构体数组还是结构体指针数组?

    如果您需要退回struct从函数中 您通常会返回一个指向struct反而 如果您想返回结构数组 建议 返回结构体数组 指向第一个元素的指针 或者返回一个结构体指针数组 我为以下两个选项画了一个图表 1 2 给出以下结构定义 struct v
  • 在 Python 中解压嵌套的 C 结构

    我正在尝试解压一个 C 结构 该结构以二进制形式传递给我的 Python 程序 并包含另一个嵌套结构 C 标头的相关部分如下所示 typedef struct uint8 t seq uint8 t type uint16 t flags
  • 错误:unpack_from 需要缓冲区

    我正在使用 struct 来格式化固定分隔的 txt 文件 这是前两行 Sat Jan 3 18 15 05 2009 62e907b15cbf27d5425399ebf6f0fb50ebb88f18 4a5e1e4baab89f3a325
  • 如何防止无名结构\联合?

    我正在构建一个具有矩阵数据联合的类 但是 只有当我没有结构 联合的名称时 我才能对其进行编译 但是 如果警告级别更高 视觉工作室为四级 我会发出警告说 warning C4201 nonstandard extension used nam
  • 如何在 hive 中创建一个空的结构数组?

    我有一个观点Hive 1 1 0 根据条件 它应该返回一个空数组或一个数组struct
  • C:静态结构[重复]

    这个问题在这里已经有答案了 我对 C 相当陌生 正在查看一些代码来了解哈希 我发现一个文件包含以下代码行 include
  • 如何在 Windows 8.1 中的 anaconda(python3.6) 中构建 cython pyx 到 pyd?

    我参考了一些网站在 Windows 8 1 中将 pyx 构建为 pyd 我正在使用带有 Spyder IDE 的 Anaconda Distribution 我已经开发了 pyx 文件 但无法在 Anaconda 命令提示符 中构建 水蟒
  • 如何将Matlab命令的输出重定向到文件? [复制]

    这个问题在这里已经有答案了 我想将 Matlab 命令的输出重定向或复制到文件中 我怎样才能做到这一点 就我而言 我想使用 UNIX 工具比较两个大型结构diff 示例 我可以在 Matlab 中执行此操作 gt gt s1 s1 a 32
  • Security.h 中结构的 macOS 文档

    我正在尝试使用Security h通过 Java 和 JNA 的 macOS 框架 这意味着我需要将某些结构重建为 Java 类 问题是 当我查看文档中的结构时 this one https developer apple com refe
  • 与可变结构相比,不可变结构有哪些优点?

    我已经知道不变性相对于可变性的好处在于能够推理代码并引入更少的错误 尤其是在多线程代码中 不过 在创建结构时 我看不出创建一个完全不可变的结构比创建一个可变的结构有任何好处 让我们以保存一些分数的结构为例 struct ScoreKeepe
  • 按属性值对结构体数组进行排序

    我在 C 中有一个任务 使用 qsort 对结构进行排序 struct user enum SEX m f sex char name 32 char phonenr 32 typedef struct user User 用户将存储在一个
  • 为什么Java不支持结构体? (只是出于好奇)

    我知道您可以使用公共字段或其他一些解决方法 或者也许你根本不需要它们 但只是出于好奇为什么 Sun 没有考虑结构 这是一个link http www oracle com technetwork java simple 142616 htm
  • C 标准中 char 数组结构成员的对齐

    假设我想读 写 tar 文件头 考虑标准 C C89 C99 或 C11 关于填充 字符数组在结构中是否有任何特殊处理 编译器可以向这样的结构添加填充吗 struct header char name 100 char mode 8 cha
  • 在 C 或 C++ 中返回结构是否安全?

    我的理解是不应该这样做 但我相信我已经看到过这样做的示例 注意代码不一定在语法上正确 但想法就在那里 typedef struct int a b mystruct 然后这是一个函数 mystruct func int c int d my
  • Python:如何使用 struct.pack_into 将不同类型的数据打包到字符串缓冲区中

    我正在尝试将一些无符号 int 数据打包到使用创建的字符串缓冲区中ctypes create string buffer 这是以下代码段 以及显示错误的运行示例在键盘上 http codepad org S8nUWMcW import st
  • “struct X typedef”与“typedef struct X”的含义是什么?

    我在现有代码库中有以下 工作 代码 在 C 和 C 之间共享的包含文件中使用 在 MSVC 2010 和 Windows DDK 上编译 struct X USHORT x typedef X PX And enum MY ENUM enu
  • 在 C 中使用另一个结构中的二维结构数组的编码问题

    我正在使用一个二维结构数组 它是另一个结构的一部分 这不是我做过很多事的事情 所以我遇到了问题 该函数在接近末尾的 测试 for 循环后最终失败 它在出现段错误之前正确打印出一行 我的代码中将数据读入虚拟二维结构数组的部分工作得很好 所以它
  • for 循环初始值设定项中的结构

    知道为什么 for 循环初始值设定项中的这个结构表达式在编译时会出现语法错误吗 在这种情况下 指向结构的指针工作正常 但 ofc 我需要如下所示的局部变量 感谢您的建议 type Request struct id int line byt
  • 如何让 C# 设计器编辑我的结构属性?

    我正在使用 C 创建一个具有多个自定义属性的自定义 Windows 窗体控件 这些属性之一是一个带有几个整数字段的简单结构 public struct Test public int A B Test Test Category MyCat

随机推荐

  • 5 种方法重复执行历史命令

    Linux 下 如果要执行一条或多条之前输过的指令 要怎么处理 很多人会想到使用上下箭头去翻查历史输入的命令 这当然是可以了 除了这种方法 本文再介绍另外 5 种方法来实现这样的效果 在正式开始之前 我们先随便执行几条命令 便于后面演示 为
  • Anaconda 更换镜像源、创建虚拟环境并安装 PyTorch

    文章目录 1 更换镜像源 2 选择合适的 CUDA Runtime 版本 2 1 CUDA Runtime 版本不能高于 CUDA Driver 版本 2 2 根据显卡的算力和架构确定 CUDA Runtime 版本 2 3 找到安装 Py
  • Ps2021软件安装Mac(含M1)、Windows版

    一 下载链接 Mac版本 1 M1芯片适用 百度网盘下载地址 提取码 rpyn 2 M1不适用 系统10 15及以上 下载地址 Windows版本 Ps2022 64位 此版本不支持LTSC版本系统 百度网盘下载地址 提取码 wb2d 二
  • MySQL: 运算符使用练习

    前言 练习运算符的使用 加强记忆 案例目的 在已建数据库中创建数据表 并对表中数据进行处理 练习运算符 包括数据运算符 逻辑运算符 位运算符 的使用 操作过程 创建名为 tb15 的数据表 包含 VARCHAR 100 类型的字段 note
  • 在vue中使用this.$refs报错undefined找不到子组件的方法

    最近遇见个问题 在父组件调用子组件的方法时报错undefined 这种情况一般都是父组件调用子组件方法的时候 dom还没更新成功 可以使用 this nextTick 这个方法作用是当数据被修改后使用这个方法会回调获取更新后的dom再渲染出
  • Spring MVC视图解析器

    Spring MVC视图解析器 AbstractCachingViewResolver XmlViewResolver ResourceBundleViewResolver UrlBasedViewResolver InternalReso
  • 报错Caused by java lang ClassNotFoundException Didn't find c

    分享一下我老师大神的人工智能教程 零基础 通俗易懂 风趣幽默 还带黄段子 希望你也加入到我们人工智能的队伍中来 https blog csdn net jiangjunshow 报错信息 03 14 20 24 09 675 15801 1
  • 赛码-接金币-java

    题目描述 小赛非常喜欢玩游戏 最近喜欢上了一个接金币的游戏 在游戏中 使用帽子左右移动接金币 金币接的越多越好 但是金币掉到地上就不能再接了 为了方便问题的描述 我们把电脑屏幕分成11格 帽子每次能左右移动一格 现在给电脑屏幕如图标上坐标
  • 浅谈systemd

    浅谈systemd systemd的基本概念 Systemd的管理服务 Systemd的管理运行级别 systemd的基本概念 一 system的简要介绍 定义 系统启动和服务器守护进程管理器 负责在系统启动或运行时 激活系统资源 服务器进
  • 使用Docker安装Portainer

    打开powershell输入命令 docker run d p 9000 9000 restart always v var run docker sock var run docker sock name prtainer portain
  • 双轮平衡车实现自平衡功能

    1 功能说明 在双轮小车上安装一个六轴陀螺仪传感器 本文示例将实现双轮小车自主平衡功能 2 电子硬件 在这个示例中 我们采用了以下硬件 请大家参考 主控板 Basra主控板 兼容Arduino Uno 扩展板 Bigfish2 1扩展板 传
  • 【Java】Java中的“引用类型”和C中的“指针”区别

    文章目录 前言 1 Java中 基本数据类型 和 引用数据类型 变量在内存分配时的不同 2 C中 指针 的特点 3 Java中 引用 的特点 4 Java的参数传递 5 参考 前言 在学习Java中变量的数据类型时 发现其分为2大类 基本数
  • spring加载流程之ConfigurationClassPostProcessor

    spring加载流程之ConfigurationClassPostProcessor ConfigurationClassPostProcessor postProcessBeanDefinitionRegistry processConf
  • FPGA面试真题解析

    FPGA面试真题解析 1 1 十进制46 25对应的二进制表达式为 硬件逻辑实习岗 A 101110 11 B 101101 01 C 101110 1 D 101110 01 解析 这个问题看上去很简单 那是因为我们平时可以打开电脑上的计
  • 若依-了解头像(文件)上传流程

    周知 本文主要记录本人关于自主学习若依框架的部分心得经验 必定有许多不足甚至理解有误的部分 如果对你有帮助我也不胜欢喜 如果发现有错误的地方也希望能够分享指出 一起加油 需求原因 客户内部系统 一般不对外开放 因此不适合将文件 如图片 存放
  • 常用的函数接口

    常用的函数接口 FunctionalInterface public interface Function
  • R语言 if else 语句

    R语言中if else语句的编写格式 因为R是解释语言 如果else单独起一行 无法解释执行 所以else不能单独一行 最好这样写 if a print hello else print Hi 转载于 https www cnblogs c
  • 基于vue+element-ui实现Cascader级联选择器+Table树形数据

    开发进度提前50 啊 真香 下面 看图说话 Table树形数据 Cascader级联选择器 功能实现 详细代码 Cascader级联选择器 options属性指定选项数组即可渲染出一个级联选择器 所以后端接口返回的数据结构要保持一一致性 这
  • 记一次Redis批量删除Key问题

    记一次Redis批量删除Key问题 前言 最近在项目中使用redis时发现一个问题 批量删除的时候删除不了 代码如下 redis配置 Bean public RedisTemplate redisTemplate RedisConnecti
  • C/C++中关于位域的一些总结

    转载自 http blog csdn net xkjcf article details 7688528 由于信息存储时 可能只占一位或者几位二进制位 比如开关量 只需要占据一位即可 为了节省存储空间 并且处理简单 C语言提供了一种数据结构