位字段 bit field

位字段是一个signed int或者unsigned int中一组相邻的位。位字段由一个结构声明建立,该结构声明为每个字段提供标签,并决定字段的宽度。

struct p {
unsigned int autfd : 1;//autfd字段占一个int其中的1位宽度
unsigned int bldfc : 1;
unsigned int undln : 1;
unsigned int itals : 1;
//字节剩下的位空出
} ;
struct p pt;
pt.autfd = 0;
pt.bldfc = 1;
//...

这里生命了一个p,其包含四个一位字段。p被存储在一个usigned int大小的存储单元中,但仅使用了其中的4位。

字段的位数可以是多位。

 struct pp {
unsigned int code1 : 2;
unsigned int code2 : 2;
unsigned int code3 : 4;
unsigned int code4 : 1;
} ;//pp中声明了两个2位字段,一个4位字段,一个1位字段

pp会占两个unsigned int存储单元,但是只会按顺序使用其中的9位。

如果声明的位字段总位数超过一个unsigned int空间,像上面那样,相邻的下一个unsigned int存储空间会被利用。但是不允许一个位字段的位数跨越两个unsigned int的边界。当出现一个位字段位数跨越了边界时,编译器会自动移除掉这个位字段,空出来,就像一个洞一样,使得边界对齐。

可以使用未命名的字段填充这样的洞。当指定未命名位字段宽度为0时,会使得下一个位字段变量移动到下一个unsigned int边界开始计算位数。

struct ppp {
unsigned int field1 : 2;
unsigned int : 2;//空出两位
unsigned int field2 : 3;//然后才算field2占3位
unsigned int : 0;//field3必须从下一个unsigned int开始算位数
unsigned int field3 : 2;
};

位字段由于在不同机器上可能会有不同的存储顺序,对于字段边界位置也有区别,因此难以移植。

这样的结构赋值可以像普通struct那样进行赋值:

struct {
unsigned int field1 : 2;
unsigned int : 2;//空出两位
unsigned int field2 : 3;//然后才算field2占3位
unsigned int : 0;//field3必须从下一个unsigned int开始算位数
unsigned int field3 : 2;
} ppp = {
1,1,3
};//需要注意1,1,3按顺序值不能超出位字段位数限制

这一章我没有仔细看。

C Primer Plus--位操作的更多相关文章

  1. C Primer Plus之位操作

       二进制补码表示法 几乎所有的计算机都使用二进制补码表示法来存储位于n位存储单元中的有符号整数.    在二进制补码表示法中,最左位决定符号.如果它是0,该整数为正(即非负):如果是1,该整数为负 ...

  2. C语言学习书籍推荐《C Primer Plus(中文版)(第5版)》下载

    普拉塔 (Prata S.) (作者), 云巅工作室 (译者) <C Primer Plus(中文版)(第5版)>共17章,介绍了C语言的基础知识,包括数据类型.格式化输入输出.运算符.表 ...

  3. 《C Primer Plus(第6版)(中文版)》普拉达(作者)epub+mobi+azw3

    内容简介 <C Primer Plus(第6版)中文版>详细讲解了C语言的基本概念和编程技巧. <C Primer Plus(第6版)中文版>共17章.第1.2章介绍了C语言编 ...

  4. 关于C primer plus 的学习计划(暂停)

    最近想学数据结构,但是C的基础不够好,想借着C primer plus补一下基础.怎料第一章看的还挺快,到第二章看了二十多天.现在改改阅读方式:每日在这里添加进度,然后精看例题习题和章总结,其它简略看 ...

  5. C Primer Plus(三)

    重读C Primer Plus ,查漏补缺 重读C Primer Plus,记录遗漏的.未掌握的.不清楚的知识点 文件输入/输出 1.fgets函数在读取文件内容时会将换行符读入,但gets不会,fp ...

  6. C Primer Plus 学习体会

    本月刚刚开始学习<C primer plus>,之前课上草草学过一遍,讲到指针就结束了.现在重新开始看感觉难度不大只是刚开始接触有些语言细节比较琐碎.学习这一周的体会如下: 诸多前辈推荐的 ...

  7. C++ Primer Plus 第六版笔记

    C++ Primer Plus 第六版笔记 关于对象声明的思考 转自:http://www.cnblogs.com/weiqubo/archive/2009/11/02/1930042.html C+ ...

  8. 《3D Math Primer for Graphics and Game Development》读书笔记2

    <3D Math Primer for Graphics and Game Development>读书笔记2 上一篇得到了"矩阵等价于变换后的基向量"这一结论. 本篇 ...

  9. 《3D Math Primer for Graphics and Game Development》读书笔记1

    <3D Math Primer for Graphics and Game Development>读书笔记1 本文是<3D Math Primer for Graphics and ...

  10. 《Entity Framework 6 Recipes》中文翻译系列 (19) -----第三章 查询之使用位操作和多属性连接(join)

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 3-16  过滤中使用位操作 问题 你想在查询的过滤条件中使用位操作. 解决方案 假 ...

随机推荐

  1. 读取txt文件的数据,并将其转换为矩阵

    import numpy as nppath_txt_data = 'C:/Users/51102/Desktop/my_yolo/data/box/train.txt'def input_data( ...

  2. Elasticsearch 主要监控指标 -- 描述了es监控的几个维度,相当不错!

    转发自:https://blog.csdn.net/majianxiong_lzu/article/details/90437559 主要指标梳理 Cluster Health – Nodes and ...

  3. pandas-09 pd.groupby()的用法

    pandas-09 pd.groupby()的用法 在pandas中的groupby和在sql语句中的groupby有异曲同工之妙,不过也难怪,毕竟关系数据库中的存放数据的结构也是一张大表罢了,与da ...

  4. Java8新特性:接口

    Java接口本身没有任何实现,因为Java接口不涉及表象,而只描述public行为,所以Java接口比Java抽象类更抽象化. 以上是百度百科中对接口的定义,这个定义已经不准确. Java8对接口做了 ...

  5. JavaScript之控制表单元素的值

    表单元素.value 获取表单元素的值 表单元素.value='这是修改后的值' 修改表单元素的值 案例: (1)html <input type="text" id=&qu ...

  6. 如何用JS获取地址栏参数的方法

    采用正则表达式获取地址栏参数: 写一个方法来进行正则匹配,同样也可以复用 function GetPar(name) { var reg = new RegExp("(^|&)&qu ...

  7. java HttpClient操作工具类

    maven: <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId> ...

  8. 不依赖Python第三方库实现梯度下降

    认识 梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模), 我感觉, 其实就是偏导数向量方向 ...

  9. Linux命令——whiptail交互式shell脚本对话框

    转自:交互式shell脚本对话框----whiptail指令 当你在linux环境下setup软件的时候就会有相应的对话框让你输入.虽然我们已经习惯了这种交互的方法,但是如果有一种直观的界面来输入是不 ...

  10. MongoDB 分片问题汇总

    分片是MongoDB的扩展方式,通过分片能够增加更多的机器来用对不断增加的负载和数据,还不影响应用. 1.分片简介 分片是指将数据拆分,将其分散存在不同机器上的过程.有时也叫分区.将数据分散在不同的机 ...