Linux C语言有没有bit

66次阅读
没有评论

共计 2064 个字符,预计需要花费 6 分钟才能阅读完成。

本文丸趣 TV 小编为大家详细介绍“Linux C 语言有没有 bit”,内容详细,步骤清晰,细节处理妥当,希望这篇“Linux C 语言有没有 bit”文章能帮助大家解决疑惑,下面跟着丸趣 TV 小编的思路慢慢深入,一起来学习新知识吧。

Linux C 语言有 bit;在单片机 C 语言中,bit 是新增的一个关键词,常用来定义一个“位变量”;C 语言定义 bit 型数据的方法是:1、通过 sbit 或者 bit 定义;2、通过位域(结构体中)定义;3、通过组合位运算符定义。

C 语言定义 bit 型数据:

一、通过 sbit 或者 bit 定义

sbit 映射到 IO 口(P1^1 这种 IO 口的“位”)

bit 在 RAM 中的可位寻址空间中,一般用作程序判断的标志位。

认为它们一个对外(sbit),一个对内 (bit)。

在单片机 C 语言中,bit 是新增的一个关键词, 常用来定义一个“位变量”

二、通过位域(结构体中)定义

位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:

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-  
 PBit- b  
 PBit- c|=1; 
 printf(%d,%d,%d\n ,PBit- a,PBit- b,PBit-  }

上例程序中定义了位域结构 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 行用指针方式输出了这三个域的值。

使用位域的主要目的是压缩存储,其大致规则为:

1)   如果相邻位域字段的类型相同,且其位宽之和小于类型的 sizeof 大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;

2)   如果相邻位域字段的类型相同,但其位宽之和大于类型的 sizeof 大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;

3)   如果位域字段之间穿插着非位域字段,则不进行压缩;

4)   整个结构体的总大小为最宽基本类型成员大小的整数倍。

三、通过通过组合 位运算符 来操作

#define Setbit(x,y) (x|=(0x01 y)) // 置位
#define Clrbit(x,y) (x =(~(0x01 y))) // 复位(清零)#define Chkbit(x,y) (x (0x01 y))  // 检位 

读到这里,这篇“Linux C 语言有没有 bit”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-12发表,共计2064字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)