问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

c语言 关于位域的使用

发布网友 发布时间:2022-04-24 01:50

我来回答

2个回答

热心网友 时间:2023-07-15 21:28

一、位域
  有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:
  struct 位域结构名
  { 位域列表 };
  其中位域列表的形式为: 类型说明符 位域名:位域长度

struct bs

{
 int a:8;
 int b:2;
 int c:6;
};
位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:

struct bs
{
 int a:8;
 int b:2;
 int c:6;
}data;
  说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:
  1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:

struct bs
{
 unsigned a:4
 unsigned :0 /*空域*/
 unsigned b:4 /*从下一单元开始存放*/
 unsigned c:4
}
  在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。
  2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
  3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:

struct k
{
 int a:1
 int :2 /*该2位不能使用*/
 int b:3
 int c:2
};
  从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。
  二、位域的使用
  位域的使用和结构成员的使用相同,其一般形式为: 位域变量名·位域名 位域允许用各种格式输出。

main(){
 struct bs
 {
  unsigned a:1;
  unsigned b:3;
  unsigned c:4;
 } bit,*pbit;
 bit.a=1;
 bit.b=7;
 bit.c=15;
 printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
 pbit=&bit;
 pbit->a=0;
 pbit->b&=3;
 pbit->c|=1;
 printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);
}
  上例程序中定义了位域结构bs,三个位域为a,b,c。说明了bs类型的变量bit和指向bs类型的指针变量pbit。这表示位域也是可以使用指针的。
  程序的9、10、11三行分别给三个位域赋值。( 应注意赋值不能超过该位域的允许范围)程序第12行以整型量格式输出三个域的内容。第13行把位域变量bit的地址送给指针变量pbit。第14行用指针方式给位域a重新赋值,赋为0。第15行使用了复合的位运算符"&=", 该行相当于: pbit->b=pbit->b&3位域b中原有值为7,与3作按位与运算的结果为3(111&011=011,十进制值为3)。同样,程序第16行中使用了复合位运算"|=", 相当于: pbit->c=pbit->c|1其结果为15。程序第17行用指针方式输出了这三个域的值。

热心网友 时间:2023-07-15 21:29

可以通过移位,还有位与来遍历吧
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 交互设计的“根”——七大定律 交互设计原则和理论2——七大定律 七大设计原则 附近的加油站有哪些 附近的加油站有哪些地方 关于c语言的“位域”。 C语言中“位域”与“域宽”有什么区别。 用网银转账如何修改已经存在账户信息 工商银行,转账成功后,保存的快照在哪? 工行网银转账成功截图如何保留? 中国银行网银汇款后保存的常用收款人账号怎样删除 农行网银转账记录如何删除? 工行个人网上银行中的交易快照信息可以保留多久? 网上银行转账记录怎么删除 网银转账记录怎么删除 如何删除工商银行交易快照? 取罗什么名字好 姓罗的女生取什么名字让看字面好听起来也可以 最好有古文出处 姓罗,女生,取什么名字好 罗字起名字那个名字好分数高分 姓罗取什么名字好 有没有什么比较有趣好玩的电脑软件 求好玩的电脑小软件 能给我介绍几个电脑上用的着的有意思的软件吗? 好玩的电脑软件有哪些 C语言中位域和结构体得区别是什么? 关于C语言中位域的问题 c语言 位域长度 c语言 结构体位域问题 C语言中关于位域的疑问? 绝色混血美女,芭比娃娃般的粉嫩美少女.女主角名字是? C语言中位域大小与宽度该怎么算? 粉嫩类型小女生是最受欢迎的么 关于C语言里的位域赋值问题 求大神分享【liuxiangdada】粉嫩小女生 含苞待放480P种子下载,好人一生平安 C语言结构体位域问题 美女一身粉色吊带连衣裙,粉嫩迷人还少女,你喜欢吗? c语言位域问题 的做法,清蒸小鲫鱼怎么做好吃,清蒸小鲫鱼的家常做法 “绝色混血美女的*,完美芭比娃娃般的美少女粉嫩”的女主角叫什么名字??下载地址是什么??? 结构体定义 清蒸鲫鱼有哪些简单易学的做法? 美女之家绝对粉嫩小乳牛酸酸甜甜就是我的那个女的是谁。 C语言的结构体位定义问题 做法,清蒸小鲫鱼怎么做好吃,清蒸小鲫鱼的家常做法