基于任务驱动的C语言程序设计 高职计算机大类专业 李祥林 课件ch9

上传人:w****i 文档编号:92368198 上传时间:2019-07-09 格式:PPT 页数:20 大小:92.50KB
返回 下载 相关 举报
基于任务驱动的C语言程序设计 高职计算机大类专业 李祥林 课件ch9_第1页
第1页 / 共20页
基于任务驱动的C语言程序设计 高职计算机大类专业 李祥林 课件ch9_第2页
第2页 / 共20页
基于任务驱动的C语言程序设计 高职计算机大类专业 李祥林 课件ch9_第3页
第3页 / 共20页
基于任务驱动的C语言程序设计 高职计算机大类专业 李祥林 课件ch9_第4页
第4页 / 共20页
基于任务驱动的C语言程序设计 高职计算机大类专业 李祥林 课件ch9_第5页
第5页 / 共20页
点击查看更多>>
资源描述

《基于任务驱动的C语言程序设计 高职计算机大类专业 李祥林 课件ch9》由会员分享,可在线阅读,更多相关《基于任务驱动的C语言程序设计 高职计算机大类专业 李祥林 课件ch9(20页珍藏版)》请在金锄头文库上搜索。

1、1,第九章 位运算,教学目标 了解位运算的概念、位段的定义及使用;掌握常用位运算符的作用及其使用规则;熟悉位运算在微机控制、状态测试等技术中的应用。 教学重点 常用位运算符的作用及其应用。 教学难点 常用位运算符的应用。,2,假设我们用字节的第1、2、3位分别代表温度报警信号、电源停电报警信号、压力报警信号,这些信号既有输出又有输入。当某报警信号有效产生中断后,计算机就要对各信号进行测试以确定下一步的工作方式,编写C函数测试某一位状态(规定最低位为第1位,位序号从最低位开始依次增加)。,9.1引例控制系统状态测试,3,2引例分析 计算机中,所有数据都以二进制形式保存,即每一位的状态为“0”或“

2、1”,测试某一位的状态就是对该位的值进行判断。 3程序代码 #define YES 1 #define NO 0 int exambit(int rdinnum,int num) int measure=1; measure=(num-1); return(rdinnum ,4,9.2常用位运算符,9.2.1按位与运算符 1运算规则 按位与运算符“&”是一个双目运算符,只有两个数对应位上的值均为1时该位上的结果值才为1,否则为零。 0&0=0,1&0=0,0&1=0,1&1=1 例如:9 & 500001001 & 00000101=000000011,5,2具体应用 (1)保留或测试指定位。

3、 例如:测试数12第3位的值可通过运算:12&4=00001100 & 00000100=00000100=4,结果不为零,表示第3位的值为1。 (2)指定位清0。 例如:将数892(0000001101111100)的高8位清零,保留低8位,可将该数与255(0000000011111111)进行&运算: 0000001101111100 & 0000000011111111 0000000001111100 (十进制124),6,9.2.2按位或运算符,1运算规则 按位或运算符“|”是一个双目运算符,只要两个数对应位上的值有一个为1,该位上的结果值就为1。 0|0=0,1|0=1,0|1=

4、1,1|1=1 例如: 12|700001100 | 00000111=0000111115 2具体应用 将一个数的指定位置1。例如:要将数0000000010100000的低4位置1,只需将它与数0000000000001111按位做或运算即可: 0000000010100000 | 0000000000001111 0000000010101111 运算结果低4位为1,其余位保持不变。,7,9.2.3按位异或运算符,1运算规则 按位异或运算符“”也是一个双目运算符,只要两个数对应位上的值互不相同,该位上的结果值就为1。 00=0,10=1,01=1,11=0 例如:12700001100

5、00000111=0000101111,8,2具体应用 (1)指定位翻转。 例如:将数0000000001111010的低4位翻转,即1变0,0变1,可将它与0000000000001111进行运算: 0000000001111010 0000000000001111 0000000001110101 (2)保留指定位。 方法:将指定位与0进行异或运算。 (3)交换两个变量的值(不用中间变量)。 方法:执行语句序列a=ab;b=ba;a=ab;则a、b值交换。,9,9.2.4按位取反运算符,1运算规则 按位取反运算符“”是一个单目运算符,功能是对每个位上的值按位求反,即1变0,0变1。 0=1

6、,1=0 2具体应用 当不知道被处理量的具体位数时,取反运算很有用,可以采用表达式x&1,因为1的二进制表示中最后1位为1,前面各位都是0。对于16位整数,前面有15个0;对于32位整数,前面共有31个0,不管怎样1求反后都可以使x保留前面各位的原值,而只把最后1位置0。,10,9.2.5左移运算符,1运算规则 左移运算符“”是一个双目运算符,前面是要移动的量,后面是移动的位数,高位左移溢出丢弃,低位左移补0。例如:a=00000001(十进制1),a4位后为00010000(十进制16)。 2具体应用 没有高位丢失时,左移运算相当于乘法运算,左移1位即乘以2,左移n位即乘以2 的n 次方。

7、例如:unsigned int a=15(00001111),a2 结果为00111100(十进制60),相当于 。,11,9.2.6右移运算符,1运算规则 右移运算符“”也是一个单目运算符,对无符号数,高位补0,低位丢失;有符号数,补与高位相同的数,低位丢失。 2具体应用 没有低位丢失时,右移n位,相当于原数除以。右移比除法运算花费时间少。 例如:unsigned int a=16(00010000),a2 结果为00000100(十进制4),相当于。,12,9.2.7位运算赋值,位运算赋值符包括: 判断rdinnum&measure是否为0,为0则表示dinnum的第num位为0,否则为1

8、。,13,【例9-1】将一个十进制正整数按二进制形式输出。 1问题分析 1)采用除2取余法,用数组保存各二进制位。(速度较低) 2)构造整型二进制数b=1000 0000 0000 0000,将十进制数dnum与b按位作与运算,得到二进制数最高位并输出,然后b右移一位继续与dnum按位与得到次高位,依此方法得到所有二进制位。,9.4位运算应用举例,14,2程序代码,void dec_bin(unsigned int dnum); void main() unsigned int num; /*num是要求转换的十进制数*/ printf(“Please enter a decimal posi

9、tive integer:“); scanf(“%u“, ,void dec_bin(unsigned int dnum) int i,n; unsigned int b; /*b为位测试变量*/ n=sizeof(int)*8; b=1; for (i=0;i=1; printf(“n“); ,15,【例9-2】整数循环右移。 1问题分析 为实现循环移动n位,可以采用下列步骤: (1)将数a的右端n位先放到数b的高n位中,语句如下: b=an; (3)将c和b进行按位或运算,语句如下: c=c|b;,16,2程序代码 main() unsigned a,b,c; int n; printf(

10、“nPlease enter an integer and the moving number:“); scanf(“%o%d“, ,17,【例9-3】取一个16位整数a从右端开始的4至7位。 1问题分析 (1)先使a右移4位,即a 4; (2)设置一个低4位全是1,其余全是0的数(0 4&(0 4),得到要求的结果。,18,2具体应用 将一个数的指定位置1。例如:要将数0000000010100000的低4位置1,只需将它与数0000000000001111按位做或运算即可: 0000000010100000 | 0000000000001111 0000000010101111 运算结果低

11、4位为1,其余位保持不变。,19,2程序代码 #include #include int main() int a,b,c,d; scanf(“%d“, ,20,本章小结,1位运算是语言的一种特殊运算功能,它以二进制位为单位进行运算。位运算符有逻辑运算和移位运算两类。 2位运算符可以与赋值符一起组成复合赋值符,如&=、|=、=、=、=等。 3利用位运算可以完成汇编语言的某些功能,如位置1、位清0、移位、取出某些位等。 4位段在本质上是一种结构体类型,不过它的成员按二进制位分配内存,其定义、说明及使用方法都与结构体类型相同。 5位段的使用使得在高级语言中实现了数据的压缩,节省了存储空间,提高了运行效率。,

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

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

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