c语言的位和位段结构的运算

来源:互联网 发布:为什么软件下载失败 编辑:程序博客网 时间:2024/05/29 16:28

写的原因:

1.更加详细的介绍,对初学者的指导。

2.记录自己生活。

内容:

C语言是一个非常灵活的语言,虽然它是面向过程的语言,但是可以定义结构,定义自己的类型。上可以进行接近面向对象,下可以达到硬件的汇编。不说这些了。

首先,要想使用c语言的位域结果,必须了解unsigned类型,它是无符号类型,并且是按位存贮的。所以全部存贮的是0,1。

其次,了解运算符。语言提供了六种位运算符:
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移

至于这些运算规则,我就不啰嗦了。参考C语言教科书。

下面来看位段结构:

位段结构也是一种数据结构,只不过其中含有以为为单位定义存贮长度的整数类型的位段成员。

定义方法:

struct bytedata

{

unsigned  a:2;//位段a

unsigned  b:2;

unsigned  :2;//无名位,不能访问,为什么要设置,下面介绍

unsigned  :0;//标识下一字段从下一字边界开始

int i;//成员i

}data;

为什么要设置无名段:由于每一个位段不能超过C语言版本的字长,当作填充用。

什么是字边界:即以C语言版本的字长为单位,下一字长的开始位置。

应该注意一下几点:

1.位段长度不能超过存贮单元(字长)。

2.可以定义无名段。

3.可以定义:0,设置从下一字长开始。

4.不能进行取地址运算。

5.位段可以使用%d,%c,%x输出。

6.在表达式中是整数。

7.应用像结构体一样进行引用。

8.前面是地位后面是高位。

9.位段支持所有的位操作。

现在已经说的很明白了。

简单的附一个赋值代码:

#include"stdio.h"
typedef struct Test
 {
  unsigned char b0:8;
  unsigned char b1:8;
  unsigned char b2:8;
  unsigned char b3:8;
 }BTest;
 void main()
 {
   BTest c,d,e;
   c.b0=1;
   c.b1=2;
   c.b2=3;
   c.b3=4;
    d.b0=0;
    d.b1=1;
    d.b2=2;
    d.b3=3;
    e.b0=c.b0^d.b0;
  printf("%d%d%d",c.b0,c.b1,e.b0);
 }

原创粉丝点击