Contents
  1. 1. 位段
    1. 1.1. 位段简介
    2. 1.2. 利用共用体可以实现位段的赋值,这一点可以简化PCM译码。

位段

今天做PCM编码译码的C语言实现,需要对位进行操作,在同学的提示下接触到了C语言的位段,不禁感叹,C语言真是很强大。

位段简介

位段是一种特殊的结构体类型,其每个成员是以位为单位来定义长度的,而不再是各种类型的变量。

1
2
3
4
5
6
7
struct packed_data
{
unsigned x:1; //位段x,占1位
unsigned y:2; //位段y,占2位
unsigned z:3; //位段z,占3位
int :6; //无名位段,占6位
}bits;

位段有一些需要注意的地方。

  • 一个位段必须说明int, unsigned, signed中的一种。长度为1的字段被认为是unsigned类型,因为单个的位段没有符号。
  • 位段中成员的引用与结构体中成员的引用是一致的,用“.”运算符。例如:bits.x代表位段bits中得第一位,为0或者1。
  • 可以定义无名字段。
  • 一个位段必须在一个存储单元中,所以位段总长不能超过整型长度的边界。
  • 位段可以在表达式中被引用(按整型数),也可以按照整型格式符输出。
  • 位段不能定义数组。
  • 不同的机器内部,位段是从左向右分布还是从右向左分布式不一定的。

利用共用体可以实现位段的赋值,这一点可以简化PCM译码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main(int argc, const char *argv[])
{
union
{
int i;
struct
{
unsigned a:1;
unsigned b:1;
unsigned c:2;
}bits;
}num;
num.i = 7;
printf("i = %3d, bits = %3d%3d%3d\n", num.i, num.bits.c, num.bits.b, num.bits.a);
return 0;
}

程序运行的情况为:

i = 7, bits = 1 1 1
当将bits的a,b,c分别赋值为1时,也可以自动填充i的指,笔者已经测试过。

Contents
  1. 1. 位段
    1. 1.1. 位段简介
    2. 1.2. 利用共用体可以实现位段的赋值,这一点可以简化PCM译码。