教学材料《C语言》-第十一章_第1页
教学材料《C语言》-第十一章_第2页
教学材料《C语言》-第十一章_第3页
教学材料《C语言》-第十一章_第4页
教学材料《C语言》-第十一章_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

11.1位运算符

C语言既具有高级语言的特点,也具有低级语言中按位运算的功能。因此,C语言被广泛应用于开发系统软件和应用软件。掌握位运算,对于编写控制位一级运算的程序非常重要。前面章节介绍的各种运算都是以字节作为最基本单位进行的。但在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能。所谓位运算,是指对二进制位进行的运算。这使C语言能像汇编语言一样用来编写系统程序。下一页返回11.1位运算符

C语言提供了6种位运算符,如表11.1所示。【说明】(1)表11.1所示的运算符除~为单目运算符外,其余均为双目运算符,即要求两侧各有一个运算量。(2)位运算量只能是整型或字符型数据,不能为实型或他类型数据。上一页下一页返回11.1位运算符

1.按位与运算符(&)按位与运算符(&)是双目运算符,其功能是参与运算的两数各对应的二进制位相与。只有对应的两个二进制位均为1时,结果位才为1;否则,结果为0。参与运算的数以补码方式出现。按位与运算符(&)可简单描述为0&0=0;0&1=0;1&0=0;1&1=1;例如,9&5可写算式如下:可见,9&5=1。按位与运算通常用来对某些位清0或保留某些位。例如,把a的高8位清0,保留低8位,可作a&255运算(255的二进制数为0000000011111111)。上一页下一页返回11.1位运算符

【例11-1】按位与运算符程序使用示例。上一页下一页返回11.1位运算符

2.按位或运算符(|)按位或运算符(|)是双目运算符,其功能是参与运算的两数各对应的二进制位相或。只要对应的二个二进制位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。按位或运算符(|)可简单描述为0|0=0;0|1=1;1|0=1;1|1=1;例如,9|5可写算式如下:可见,9|5=13。按位或运算常用来对一个数据的某些位定值为1。例如,a是一个整数(16位),作a|255(255的二进制数为0000000011111111)运算后,低8位全部置为1,高8位保留原样。上一页下一页返回11.1位运算符

【例11-2】按位或运算符程序使用示例。运行结果:上一页下一页返回11.1位运算符

3.按位异或运算符(^)按位异或运算符(^)是双目运算符,其功能是参与运算的两数各对应的二进制位相异或。当两对应的二进制位相异时,结果为1。参与运算的两个数仍以补码出现。按位异或运算符(^)可简单描述为0^0=0;0^1=1;1^0=1;1^1=0;例如,9^5可写算式如下:可见,9^5=12上一页下一页返回11.1位运算符

按位异或运算可以使某些特定位翻转。例如,要想对00001001的低4位翻转,则可将其与00001111进行按位异或运算。上一页下一页返回11.1位运算符

【例11-3】按位异或运算符程序使用示例。上一页下一页返回11.1位运算符

4.取反运算符(~)取反运算符(~)为单目运算符,具有右结合性。其功能是对参与运算的数的各二进制位按位求反,即1变为0,0变为1。取反运算符(~)可简单描述为~0=1;~1=0;5.左移运算符(<<)左移运算符(<<)是双目运算符。其功能把“<<”左边运算数的各二进制位全部左移若干位,由“<<”右边的数指定移动的位数,高位丢弃,低位补0。例如,“a<<4”指把a的各二进制位向左移动4位。若a=00000011(十进制3),则左移4位后为00110000(十进制48)。左移1位相当于乘2,左移2位相当于乘4。但此结论只适用于该数左移时被溢出丢弃的高位中不包含1的情况。例如,a=00000011(十进制3),a<<1为00000110(十进制6),a<<2为00001100(十进制12)。上一页下一页返回11.1位运算符

6.右移运算符(>>)右移运算符(>>)是双目运算符。其功能是把“>>”左边的运算数的各二进制位全部右移若干位,“>>”右边的数指定移动的位数。设a=16,则a>>2表示把00010000右移为00000100(十进制4)。右移1位相当于除2,右移2位相当于除4。若a=00010000(十进制16),则a>>1为00001000(十进制8),a>>2为00000100(十进制4)。【说明】对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位补0或补1取决于编译系统的规定。TurboC2.0和很多系统规定为补1。上一页下一页返回11.1位运算符

【例11-4】左移、右移运算符程序使用示例。上一页下一页返回11.1位运算符

【例11-5】对字符形数据也可以进行位运算。上一页下一页返回11.1位运算符

运行结果:上一页返回11.2位段

有些信息在存储时,并不需要占用一个完整的字节,而只需占一个(或几个)二进制位。例如,在存放一个开关量时,只有0和1两种状态,用一个二进制位即可。为了节省存储空间,并使处理简便,C语言提供了一种数据结构,称为位段或位域。所谓位段,是把一个字节中的二进制位划分为几个不同的区域,并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。这样就可以把几个不同的对象用一个字节的二进制位段来表示。下一页返回11.2位段

1.位段的定义和位段变量的说明位段定义与结构体定义相仿,其形式为struct位段结构体名{位段列表};其中,位段列表的形式为类型说明符位段名:位段长度例如:structbs{

inta:8;intb:2;intc:6;};上一页下一页返回11.2位段

位段变量的说明与结构体变量说明的方式相同,可采用先定义后说明、同时定义说明或者直接说明这三种方式。例如:structbs{

inta:8;intb:2;intc:6;}data;其中,data为bs变量,共占两个字节;位段a占8位,位段b占2位,位段c占6位。上一页下一页返回11.2位段

【说明】(1)一个位段必须存储在同一个字节中,不能跨两个字节。若一个字节的所剩空间不够存放另一位段,则从下一单元起存放该位段。也可以有意使某位段从下一单元开始。例如:structbs{

unsigneda:4unsigned:0

/∗空域∗/unsignedb:4

/∗从下一单元开始存放∗/unsignedc:4}在这个位段定义中,a占第1字节的4位,后4位填0表示不使用,b从第2字节开始,占用4位,c占用4位。上一页下一页返回11.2位段

(2)由于位段不允许跨两个字节,因此位段的长度不能大于一个字节的长度,即不能超过8位二进制位。(3)位段可以无位段名,这时它只用来作填充或调整位置。无名的位段是不能使用的。例如:structk{

inta:1int

:2

/∗该2位不能使用∗/intb:3intc:2};从以上分析可以看出,位段在本质上就是一种结构类型,不过其成员是按二进制位分配的。上一页下一页返回11.2位段

2.位段的使用位段的使用和结构成员的使用相同,其一般形式:位段变量名.位段名位段允许用各种格式输出。上一页下一页返回11.2位段

【例11-6】位段的程序使用示例。上一页下一页返回11.2位段

上一页下一页返回11.2位段

程序说明:程序中定义了位段结构bs,三个位段为a、b、c。说明bs类型的变量bit和指向bs类型的指针变量pbit。这表示位段也是可以使用指针的。第7~9行分别给三个位段赋值(注意:赋值不能超过该位段的允许范围)。第10行以整型量格式输出三个域的内容。第11行把位段变量bit的地址送给指针变量pbit。第12行用指针方式给位段a重新赋值,赋为0。第13行使用了复合的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论