结构体位段的使用原则
在C语言中,结构体(Struct)是一种复合数据类型,它允许我们将多个不同类型的数据项组合成一个单一的实体。位段(Bit Field)是结构体中的一个特殊成员,它允许我们只取结构体中的某个位范围的数据,而不是整个字段。位段可以用来高效地访问和操作内存中的位。
位段的定义格式如下:
struct 位段名 {
unsigned int 位段1:宽度;
unsigned int 位段2:宽度;
...
unsigned int 位段N:宽度;
} 变量名;
这里,`位段名`是结构体的名称,`位段1`到`位段N`是结构体中的位段名称,`宽度`是指定每个位段占据的位数。`unsigned int`表示位段的数据类型,它保证了位段中的每一位都是非负数。
例如,以下是一个定义了一个包含三个位段的结构体:
struct RGB {
unsigned int red : 5;
unsigned int green : 6;
unsigned int blue : 5;
} pixel;
在这个例子中,`RGB` 结构体有三个位段:`red`、`green` 和 `blue`。每个位段分别占据了 5 位、6 位和 5 位。这样的结构体可以用来表示一个颜色像素的三原色值。
位段的访问可以通过位运算符来进行,例如`&`(按位与),`|`(按位或),`^`(按位异或),`~`(按位取反),`<<`(左移),`>>`(右移)等。
位段的使用可以节省存储空间,并且可以很方便地通过位运算符来操作特定范围的位。这在需要对内存中的位进行精细控制时非常有用。
———————————————————————————————————————————
结构体位段的原理解剖
这里的_a等等这个是变量名称
这里的2是宽度,也就是只要几个字节的意思
结构体内存对齐的时候为了节约时间,导致空间的浪费。
而位段的使用,就是节约空间,但是会导致时间的增长,其实本质时间的差别不是特别大,当然会有。
位段的单位是比特 bit,一个字节8个比特。
解释
存在的意义
程序员不需要那麽多的空间 就产生了位段
———————————————————————————————————————————
位段的内存分配举例1
首先我们知道位段的使用是在内存里面的分配是字节和字节之间是从低地址到高地址,也就是字节之间的存储是从左到右
首先我们知道位段的单位是比特bit,此时需要知道,位段之间的存储的在字节内,从右到左的方式进行存储,如果我们需要存储的第一个字节是7个bit,第二个存储的位段占据的空间是6个bit,这个时候第二个位段的存储不会直接从右到左的第八个字节直接进行存储。而是会从第二个字节从新开始进行存储,因为计算机在存储的时候,是可以直接计算出来的,当计算到剩下的空间不足以存储剩余的bit多少时候,他会去下一个字节空间进行存储。
这样的目的是防止数据的丢失。连续的存储的时候,计算机拿出来的时候是需要进行重新计算的,而且很容易导致丢失数据。所以当剩余的存储空间不能满足完全存下这个位段的时候,会去下一个空间进行存储。
图解
从右向左
接下来我们继续进行计算
当然更一下,在vs的编译器里面,位段的存储是字节之间采取从右向左
这里是长度不够的时候申请一个字节的长度
内部是从右向左使用
举例1原理解释
简单的说也就是再进行存储的时候,也就发生了截断
也就是10 12 3 4 实际上是发生了截断
所以也就是
0x 62 03 04
——————————————————————————————————————————
位段的内存分配举例2
同理这里也是一样的
这里是2 5 10 30个bit
int是4个字节 也就是32bit
——————————————————————————————————————————
位段的应用
需要节省内存的时候用位段
需要节约时间的时候 用结构体
——————————————————————————————————————————
位段的应用和使用时候的注意事项
ab可能共用一个字节
不能对位段的成员使用&操作符(看清楚 这里是错误的)