《C语言程序设计基础》课件-位运算和编译预处理_第1页
《C语言程序设计基础》课件-位运算和编译预处理_第2页
《C语言程序设计基础》课件-位运算和编译预处理_第3页
《C语言程序设计基础》课件-位运算和编译预处理_第4页
《C语言程序设计基础》课件-位运算和编译预处理_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

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

文档简介

位运算和编译预处理位运算符及位运算3原码、反码、补码2位运算计算机中数据的表示方法11、计算机中的数据单位位(bit)、字节(byte)、字(word)1)、位位是计算机中最小的数据单位。1位二进制数只能表示两种状态:0或1。2)、字节字节是由8位二进制数组成,字节是计算机表示存储容量的基本单元。图10-1是1个字节的各二进制位的编号,最左边为最高位(第7位),最右边为最低位(第0位)。位运算图10-1一个字节内各二进制位的编号位运算2、原码、反码和补码机器数通常有三种表示方法:原码、反码和补码。而现代计算机的数据存储通常采用的是补码形式。正数的3种编码表示方法是完全一致的。而负数的3种编码方法则各不相同。位运算1)原码原码表示法比较简单,最高位为符号位,为“0”表示正数,为“1”表示负数,其余数值位为该数的绝对值。例如:

+3的原码为:00000011-3的原码为:10000011位运算2)反码

反码可以由原码求得。正数的反码与原码相同;负数的反码:原码的符号位保持不变,数值位按位取反。例如:

+3的反码为:00000011-3的反码为:11111100位运算3)补码现代计算机中数据的存储通常都采用补码形式。补码的规则是:正数的补码与原码相同;负数的补码:原码符号位保持不变,数值位按位取反后,末位加1。例如:

+3的补码是:00000011-3的补码是:11111101位运算根据补码求原码的方法是:正数的原码与补码相同;负数的原码求法是把该数补码的符号位保持不变,数值位按位取反,再末位加1。例如:补码为11111010,原码是:10000110,所以该数为:—6位运算3、位运算符和位运算位运算是指操作数采用二进制位进行的运算。C语言提供了以下6种基本位运算符:按位取反(~)、按位与(&)、按位或(|)、按位异或(^)、、左移(<<)、右移(>>)。运算规则如下表10-1所示。位运算xy~xx&yx|yx^y001000011011100011110110表10-1位运算规则表位运算按位取反使用格式:~x功能:对应位翻转,原来为1变为0,原来为0变成1。举例:

9:00001001~9:11110110为-10位运算应用:间接构造一个数据以实现程序的可移植性。如:若想实现一个整数x(不管字长是16位还是32位)的最低位为0,则可使用如下语句:x=x&~1;按位与使用格式:z=x&y;功能:当x与y的对应位都为1时,则z的对应位为1,否则为0。举例:x=3;y=11;z=x&y;则z=33:00000011&11:0000101100000011位运算应用:保留数据的某些指定位,其余位置0。具体做法是:保留的指定位对应位&1,置0位对应位&0。如:有一个数为01010010,想使高4位都为0,低4位保持不变,则应&上00001111。01010010

&0000111100000010按位或使用格式:z=x|y;功能:当x与y的对应位都为0时,则z的对应位为0,否则为1。举例:x=3;y=11;z=x|y;则z=11。3:00000011|11:0000101100001011位运算应用:保留数据的某些指定位,其余位置1。具体做法是:保留的指定位对应位|0,置1位对应位|1。如:有一个数为01010010,想使高4位都为1,低4位保持不变,则应|上11110000。01010010

|1111000011110010按位异或使用格式:z=x^y;功能:当x与y的对应位相同时,则z的对应位为0,否则为1。举例:x=3;y=11;z=x^y;则z=8。

3:00000011^11:0000101100001000位运算应用:保留数据的某些指定位,其余位翻转。具体做法是:保留的指定位对应位^0,翻转位对应位^1。如:有一个数为01010010,想使高4位翻转,低4位保持不变,则应^上11110000。01010010

^1111000010100010左位移<<左位移运算符是用来将一个数的各二进制位向左移指定位,移动的位数由操作数指定,注意操作数必须是非负值。移位后其右边空出的位补0,高位左移溢出则舍弃。

左移1位相当于该数乘以2,左移2位相当于该数乘以2*2=4,9<<2=36,即乘了4,以此类推,左移n位相当于该数乘以2n。但此结论只适用于该数左移时被溢出舍弃的高位中不包含1的情况。位运算举例:分析下面程序的运行结果。#include<stdio.h>voidmain(){inta=9;printf("%d\n",a<<2);}位运算右移位>>右位移运算符是用来将一个数的各二进制位向右移指定位。右端移动的低位被舍弃,对于无符号数,左端高位补0;对于有符号数,某些机器将对左端空出的部分用符号位填补(即“算术移位”),而另一些机器则对左端空出的部分用0填补(即“逻辑移位”)。右移1位相当于该数除以2,右移2位相当于该数除以2*2=4,12>>2=3,即除了4,以此类推,右移n位相当于该数除以2n。位运算位运算举例:分析下面程序的运行结果。#include<stdio.h>voidmain(){inta=12;printf("%d\n",a>>2);}位运算所谓编译预处理是指在进行编译之前所做的工作。预处理是由C语言的预处理程序负责完成的。当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译,过程如图1所示:图1:源程序编译预处理编译预处理用一个指定的标识符(即名字)来代表一个字符串,称为宏。被定义为宏的标识符称为宏名。在编译预处理时,对程序中所有出现的“宏”,都用宏定义中的字符串去替换,称为“宏展开”或“宏替换”。宏定义由宏定义命令完成,宏代换是由预处理程序自动完成的。宏分为无参宏和有参宏两种。1、无参宏无参宏的宏名后不带参数,其定义的一般形式为:#define标识符字符串“define”是宏定义命令,“标识符”是所定义的宏名,“字符串”可以是常量、表达式和格式串。宏定义

编译预处理123宏定义是用宏名来表示一个字符串,在宏展开时则以该字符串代换宏名,这只是一种简单的替换。字符串中可包含任何字符,预处理程序对它不作任何检查。如果有错误,只能在编译已被宏展开的源程序时发现。宏定义不是说明或语句,在末尾不应加分号,否则连分号也一起替换。宏定义必须写在函数之外,其作用域为从宏定义开始到源程序结束。若要终止其作用域可使用预处理命令#undef。编译预处理456宏名习惯上用大写字母表示,以便与变量相区别。但也允许使用小写字母。宏名在源程序中若用双引号括起来,则预处理程序不对其作宏替换。在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序将作层层替换编译预处理2、带参宏C语言允许宏带参数。带参数的宏定义的一般形式为:#define宏名(参数表)字符串例如:#defineS(a,b)a*b进行宏替换时,可以像使用函数一样,通过实参与形参传递参数。编译预处理123带参宏定义中,宏名与参数表之间不能有空格。在带参宏定义时,应适当加括号,以使意义明确。参数要求实参和形参一致,而宏替换不需要,因为只作替换,不作类型检查。编译预处理任务15:带参数的宏,分析程序的功能分析:程序功能为:计算1-10的立方和#include"stdio.h"#defineFUN(x)x*x*xvoidmain(){inti;ints=0;for(i=1;i<=10;i++)s=s+FUN(i);printf(“%d\n”,s);}编译预处理文件包含是把指定的文件插入该命令行位置取代该命令行。命令一般格式为:格式1:#include<文件名>格式2:#include“文件名”如:#include<stdio.h>#include“math.h”文件包含在程序设计中非常有用,像C语言的头文件,其中定义了很多外部变量或宏,在程序设计时只要包含进来就可以了,不需要重复定义,节省了工作量,又可以避免出错。文件包含编译预处理123文件包含命令既可以用格式1,也可以用格式2,这两种格式是有区别的。使用格式1时,预处理程序在C编译系统定义的标准目录下查找指定的文件;使用格式2时,预处理程序则首先在当前的源文件目录中查找指定的文件,若未找到再到C编译系统定义的标准目录下查找指定的文件。一个include命令只能包含一个文件,且必须是文本文件。文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。编译预处理例2-16取一整数的从右端开始的4~7位位运算应用案例算法是:(1)先将这个整数的4~7位右移到0~3位(2)再用一个0~3位为1,其余位为0的数(15)来与该整数相与,可实现。1、程序清单#include<stdio.h>voidmain(){unsigneda,b,d;scanf("%o",&a);b=a>>4;d=b&15;printf("%o,%d\n%o,%d\n",a,a,d,d);}位运算应用案例运行结果:321321,20915,133、程序说明a对应的二进制数分别为:a:0110100014~7位是:1101举例1:不用临时变量,交换两个变量的值【问题描述】不使用中间变量,使用按位异或运算符也可实现交换两个变量。【算法设计】1、a^a为02、a^0为a3、异或运算符合交换律//不用临时变量,交换两个变量的值#include<stdio.h>voidmain(){inta,b;a=5;b=7;printf("交换前:a=%d,b=%d\n",a,b);a=a^b;b=b^a; a=a^b;printf("交换后:a=%d,b=%d\n",a,b);}举例2

将整数a进行循环左移3位位运算应用案例图中所示为字长为8位的整数循环左移1位实现a循环左移n位的算法是:(1)将a的左端n位先放到b的最低n位中,可以用下面的语句实现:b=a>>(16-n)(2)将a左移n位,用c=a<<n实现。(3)将c和b进行按位或运算,即c=c|b;位运算应用案例1、程序清单#include<stdio.h>#defineN3main(){unsigneda

温馨提示

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

评论

0/150

提交评论