C语言程序设计(第二版) 教学课件 ppt 作者 978-7-302-32355-6 kj-第11章位运算

上传人:E**** 文档编号:89345554 上传时间:2019-05-23 格式:PPT 页数:29 大小:187.50KB
返回 下载 相关 举报
C语言程序设计(第二版) 教学课件 ppt 作者  978-7-302-32355-6 kj-第11章位运算_第1页
第1页 / 共29页
C语言程序设计(第二版) 教学课件 ppt 作者  978-7-302-32355-6 kj-第11章位运算_第2页
第2页 / 共29页
C语言程序设计(第二版) 教学课件 ppt 作者  978-7-302-32355-6 kj-第11章位运算_第3页
第3页 / 共29页
C语言程序设计(第二版) 教学课件 ppt 作者  978-7-302-32355-6 kj-第11章位运算_第4页
第4页 / 共29页
C语言程序设计(第二版) 教学课件 ppt 作者  978-7-302-32355-6 kj-第11章位运算_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《C语言程序设计(第二版) 教学课件 ppt 作者 978-7-302-32355-6 kj-第11章位运算》由会员分享,可在线阅读,更多相关《C语言程序设计(第二版) 教学课件 ppt 作者 978-7-302-32355-6 kj-第11章位运算(29页珍藏版)》请在金锄头文库上搜索。

1、第1页,第11章 位运算,本章概述 本章的学习目标 主要内容,第2页,本章概述,C语言有一个重要特点就是可以直接对二进制位进行操作,即位运算。 二进制位简称位(bit),其值为0或1。计算机真正执行的正是由0和1构成的机器指令,计算机内数据也是由二进制表示的。 数在计算机内均是以补码的形式存储的 。 本章介绍位运算和位段结构的有关知识。,第3页,本章的学习目标,本章教学目的:理解位运算的概念,掌握基本位运算运算符的使用,理解位段的概念。 本章教学重点:基本位运算运算符的使用 本章教学难点:位段的概念,第4页,主要内容,11.1 位运算符 11.2 位运算 11.3 位运算应用举例 11.4 位

2、段结构,第5页,11.1 位运算符,第6页,11.2 位运算,取反运算“”是一个单目运算符,运算量在运算符之后,取反运算的功能是将一个数据中所有位都取其相反值,即1变0,0变1。 运算规则为: 1=0 0=1,例11.1 对于无符号的字符型数据 a=(18)10 =(00010010)2 , 则a等于(11101101)2 ,即(237)10 。 C程序如下:,11.2.1 按位取反运算,第7页,# include int main() unsigned char a=18,b; b=a; printf(“a=%d”,b); return 0; 运行结果为: a= 237,注意以下程序与左面程

3、序及运行结果的区别: # include int main() char a=18,b; b=a; printf(“a=%d”,b); return 0; 运行结果:-19,前一个程序结果很好理解,后一个因为a是带符号数据,因此a=(11101101)2的结果是一负数的补码,转换为原码时,第1位符号位不变,对剩余的部分先减1,再全部取反,因此得到的二进制原码为:10010011,即十进制的-19。,第8页,11.2 位运算,11.2.2 左移运算,左移运算“”是一个双目运算符,左移运算的功能是将一个数据所有位向左移若干位,左边(高位)移出的部分舍去,右边(低位)自动补零。,例11.2 对于无符

4、号字符型数据 a=(18)10 =(00010010)2 , a 3的结果是(10010000)2 ,即(144)10 。 C程序如下:,第9页,# include int main() unsigned char a=18, b; b=a3; printf(“a3=%d”,b); 运行结果为: a3=144,注意以下程序与左面程序的区别: # include int main() char a=18,b; b=a3; printf(“a3=%d”,b); return 0; 运行结果为: a3=-112,原因同前,对于带符号数a,因a3得到的(10010000)2, 是一负数的补码,转换为原

5、码时,第1位符号位不变,对剩余的部分先减1,再全部取反,因此得到的二进制原码为:11110000,即十进制的-112。 对于无符号数来说,在左移的过程中如果没有高位的丢失,左移1位相当于乘2,左移2位相当于乘4。 左移运算速度较快,因此有些C编译系统自动将乘2的操作用左移1位来实现,将2n幂运算用左移n位来实现。,第10页,11.2 位运算,11.2.3 右移运算,右移运算“”是一个双目运算符,右移运算的功能是将一个数据所有位向右移若干位,右边(低位)移出的部分舍去,左边(高位)移入的二进制数分两种情况:对于无符号数和正整数,高位补0;对于负整数,高位补1(适用于turboc系统)。,例11.

6、3 对于无符号字符型数据 a=(18)10 =(00010010)2 , 则 a 3的结果是(00000010)2,即(2)10 。,第11页,C程序如下: # include int main() unsigned char a=18, b; b=a3; printf(“a3=%d”,b); return 0; 运行结果为: a3=2,第12页,11.2 位运算,11.2.4 按位与运算,按位“与”运算符要求有两个运算量,其功能是将两个运算量的各个相应位分别进行“与”运算。 运算规则为: 1&1=1 0&1=0 1&0=0 0&0=0,例11.4 对于无符号数a=(173)10=(10101

7、101)2, b=(203)10=(11001011)2, 则a&b = (10001001)2 =(137)10,10101101 & 11001011 10001001,第13页,例11.5 对于有符号数a=(-83)10=(10101101)2 , b=(-53)10=(11001011)2 , 则a&b = (10001001)2 =(-119)10 。 以上二进制形式是负数的补码。C程序如右上所示。,C程序如下: # include int main() unsigned char a=173,b=203,c; c=a 运行结果为: a&b=137,10101101 & 110010

8、11 10001001,C程序: # include int main() char a=-83,b=-53,c; c=a 运行结果为: a&b=-119,第14页,11.2 位运算,11.2.5 按位或运算,按位“或”运算符要求有两个运算量,其功能是将两个运算量的各个相应位分别进行“或”运算。 运算规则为: 1|1=1 0|1=1 1|0=1 0|0=0,例11.6 对于无符号数a=(173)10=(10101101)2,b=(203)10=(11001011)2,则a|b = (11101111)2 =(239)10 。,10101101 | 11001011 11101111,第15页,

9、例11.7 对于有符号数 a=(-83)10=(10101101)2, b=(-53)10=(11001011)2, 则a|b = (11101111)2 =(-17)10 。,C程序如下: # include int main() unsigned char a=173,b=203,c; c=a|b; printf(“a|b=%d”,c); return 0; 运行结果: a|b=239,10101101 | 11001011 11101111,第16页,C程序如下: # include int main() char a=-83,b=-53,c; c=a|b; printf(“a|b=%d

10、”,c); return 0; 运行结果为: a|b= -17,第17页,11.2 位运算,11.2.6 按位异或运算,按位“异或”运算符要求有两个运算量,其功能是将两个运算量的各个相应位分别进行“异或”运算。 运算规则为: 11=0 01=1 10=1 00=0 。,例11.8 对于无符号数 a=(173)10=(10101101)2, b=(203)10=(11001011)2, 则ab = (01101110)2 =(102)10 。,10101101 11001011 01100110,C程序如下: # include int main() unsigned char a=173,b=

11、203,c; c=ab; printf(“ab=%d”,c); return 0; 运行结果: ab=102,第18页,11.3 位运算应用举例,例11.9 对内存中的二进制数“01010100”进行下列操作: 1. 用“按位与”实现: (1)把存储此二进制数的内存单元清零; (2)把此二进制数的2到4位取出(从0位开始); (3)把此二进制数的2、3、5位留下。 2. 用“按位或”运算把此二进制数后四位置1 (写出实现方法) 。,第19页,(3)要把二进制数2、3、5位留下, 与00101100进行按位与即可, 其运算过程为: 01010100 & 00101100 00000100 2.把

12、此二进制数后四位置1, 与00001111进行按位或即可, 其运算过程为: 01010100 | 00001111 01011111,1.用按位与实现: (1) 要把存储此二进制数的内存 单元清零,与0按位与即可, 其运算过程为: 01010100 & 00000000 00000000 (2)要取出二进制数2到4位, 与00011100进行按位与即可, 其运算过程为: 01010100 & 00011100 00010100,第20页,例11.10 编程将一个十六进制整型数转换为二进制数。 设该整型数占16位。,将十六进制数转换为二进制数的方法很多,这里我们利用位运算来进行处理,思路:对一个

13、十六进制整型数n的二进制(16位)形式从最高位到最低位的每一位进行测试,依次求出其值即可。 具体方法:设置一个屏蔽字mask(二进制为1000 0000 0000 0000。其相应的十六进制形式为0x8000),将mask与n进行“与”运算得出的值如为0则最高位为0,否则最高位为1;再将mask右移一位后,与n进行“与”运算得出次高位,依此类推,求出每一位的值。,第21页,# include int main() unsigned int i,n,b,mask; mask=0x8000; printf(“Input a hex number to convert:“); scanf(“%x“,

14、 ,运行情况: Input a hex number to convert: f f Binary of f f is: 00000000-11111111 Input a hex number to convert: 127 Binary of 127 is:00000001-00100111,第22页,例11.11 循环移位。 所谓循环移位是指:在移位时不丢失移位前原数据的所有位,将其作为另一端的补入位。 如:将11110001循环右移1位,应为11111000。 11110001循环右移3位,应为00111110。,第23页,实现将无符号数a循环右移n位的方法: (1) 将a左移16-n

15、位存入b中; (2) 将a右移n位存入c中; (3) 将b与c按位进行“或运算”,则结果便为所需结果。,第24页,# include int main() unsigned int n,a,b,c,d; printf(“Input a Hex number:“); scanf(“%x“, ,运行情况: Input a Hex number:f2d3 Input the number of bit to move:3 The result of move:7e5a,第25页,11.4 位段结构,1. 位段结构的概念,位段结构是一种结构体类型,只不过是在结构体中含有以位为单位定义存储长度的成员。采

16、用这种结构可以节省存储空间、方便某些特定的操作。,2 . 位段结构的定义,struct bytedata unsigned a : 2 ; /*占2位*/ unsigned b : 1 ; /*占1位*/ unsigned C: 3 ; /*占3位*/ unsigned d : 2 ; /*占2位*/ ,位段结构中位段的定义: unsigned :,例如,第26页,其存储结构如下图:,struct bytedata unsigned a : 2 ; /*占2位*/ unsigned b : 1 ; /*占1位*/ unsigned : 3 ; /*占3位,无字段名,不能引用*/ unsigned d : 2 ; /*占2位*/ ,如果需要可以跳过某些不用的位,只要将这些位段不指定位段名就无法引用。例如:,第27页,如果某一位段为位数为0的无名位段,则表示其

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

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

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