C程序设计与实例教程 教学课件 ppt 作者 曾令明 全书教案_ 第8章

上传人:E**** 文档编号:89343546 上传时间:2019-05-23 格式:PPT 页数:17 大小:190KB
返回 下载 相关 举报
C程序设计与实例教程 教学课件 ppt 作者 曾令明 全书教案_ 第8章_第1页
第1页 / 共17页
C程序设计与实例教程 教学课件 ppt 作者 曾令明 全书教案_ 第8章_第2页
第2页 / 共17页
C程序设计与实例教程 教学课件 ppt 作者 曾令明 全书教案_ 第8章_第3页
第3页 / 共17页
C程序设计与实例教程 教学课件 ppt 作者 曾令明 全书教案_ 第8章_第4页
第4页 / 共17页
C程序设计与实例教程 教学课件 ppt 作者 曾令明 全书教案_ 第8章_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《C程序设计与实例教程 教学课件 ppt 作者 曾令明 全书教案_ 第8章》由会员分享,可在线阅读,更多相关《C程序设计与实例教程 教学课件 ppt 作者 曾令明 全书教案_ 第8章(17页珍藏版)》请在金锄头文库上搜索。

1、第8章 位运算与位段,8.1 位运算 8.2 位段,前面介绍的各种运算都是以字节为基本单位而进行的,但在很多系统程序中常要求在位(bit)一级进行运算或处理,而C语言提供的位运算使得C语言能像汇编语言一样用来编写系统程序。 学习重点: 位运算 位段,位运算的作用是按二进制位对运算对象进行操作,它能够对字节或字(双字节)中的位进行检测、设置或移位,它只适用于字符型和整型数据。,8.1 位 运 算,C语言提供了六种位运算符: & 按位与 | 按位或 按位异或 取反 右移 其中, 为单目运算符,结合性为从右到左;其余都为二目运算符,结合性为从左到右。,8.1.1 按位与运算 按位与运算表示参与运算的

2、两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1;否则为0。参与运算的数以补码方式出现。 例如,9&5按如下运算: 可见,9&5=1。 按位与运算通常用来对某些位清0。例如把整型变量a的高八位清0,低八位不变,可作a&255运算(255的二进制数为0000000011111111)。,8.1.2 按位或运算 按位或运算表示参与运算的两数各对应的二进位相或。只要对应的两个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。 例如,9 | 5按如下运算: 可见,9 | 5=13。 按位或运算通常用来对某些位置1。例如把整型变量a的低八位置1,高八位不变,可作a|255

3、运算。,8.1.3 按位异或运算 按位异或运算表示参与运算的两数各对应的二进位相异或。当对应的两个二进位相同时,结果位为0,相异时,结果为1。参与运算数仍以补码出现。 例如,95按如下运算: 可见,95=12。,8.1.4 求反运算 对参与运算的数的各二进位按位求反。 例如, 9的运算为: (0000000000001001) 其结果为1111111111110110( -10的补码),8.1.5 左移运算 左移运算表示把“”左边的运算数各二进位全部向左移,移动的位数由“”右边的数指定。高位丢弃,低位补0。 例如: a4; 表示把a的各二进位向左移动4位。若a = 00000011(十进制3)

4、,则左移4位后为00110000(十进制48)。,8.1.6 右移运算 右移运算表示把“”左边的运算数各二进位全部向右移,移动的位数由“”右边的数指定。 例如,设a = 15,则a2表示把000001111右移为00000011(十进制3)。 需要说明的是,对于有符号数,右移时,符号位将随同移动。当为正数时,最高位补0;而为负数时,符号位为1,最高位是补0或补1取决于编译系统的规定。Turbo C和很多系统规定为补1。,8.1.7 位运算赋值运算符 位运算符与赋值运算符可以组成复合赋值运算符,如 &=,|=,=,=,=等。 例如,a & = b相当于a = a & b,a = 2相当于a =

5、a 2。,有些信息在存储时,并不需要占用一个完整的字节,而只需占一个或几个二进制位。例如,当存放一个开关量时,只有0和1两种状态,用一个二进位即可。为了节省存储空间,并使处理简便,C语言允许在一个结构体中以位为单位来指定其成员所占内存长度,这种以位为单位的成员称为“位段”或“位域”。,8.2 位 段,在结构体中位段的定义格式为: unsigned :; 例如: struct bytedata unsigned a:2; /*位段a,占2位*/ unsigned b:6; /*位段b,占6位*/ data; 定义了名为bytedata的结构体,含两个位段成员,其中位段a占2位,位段b占6位。同时

6、还定义了该结构体类型的变量data。,引用结构体的位段成员同引用结构体其他类型成员一样,但应注意位段的最大取值范围不要超出二进制位数限定的范围,否则超出部分会丢失。 例如: data.a=2; /*正确*/ data.a=10; /*错误,超出范围(a占2位,能容纳的最大值为3)*/ 关于位段,还需要注意以下几点: (1) 位段成员的数据类型必须是unsigned。,(2) 可以定义长度为0的位段,这使下一位段从下一存储单元(一个存储单元一般是两字节)开始。例如: struct bytedata unsigned a:1; unsigned b:2; unsigned :0; unsigned

7、 c:3; ; 本来a、b、c应连续存放在一个存储单元中,但由于用长度为0的位段将b、c隔开了,现在只能将a、b存放在一个存储单元中,而c另存放在下一个单元中。,(3) 位段不能跨单元存储,如果上一单元的剩余空间不够存储新的位段,则跳过此剩余空间,将该位段存放在下一个单元中。 (4) 可以定义无名位段,但其空间不能使用。 struct bytedata unsigned a:1; unsigned :2; /*无名位段,占2位,不能使用*/ unsigned c:3;,; (5) 一个位段的长度不能大于一个存储单元的长度。 (6) 不能定义位段数组。 (7) 位段可以以%d、%u、%o、%x等格式输出。 (8) 位段若出现在表达式中,将被系统自动转换成整型数。,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号