8项目八枚举和位运算《C语言程序设计上机指导》_第1页
8项目八枚举和位运算《C语言程序设计上机指导》_第2页
8项目八枚举和位运算《C语言程序设计上机指导》_第3页
8项目八枚举和位运算《C语言程序设计上机指导》_第4页
8项目八枚举和位运算《C语言程序设计上机指导》_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

1、工程八 枚举和位运算【实验内容、步骤】1、检查所用计算机是否已经安装Visual C+ 2021。2、进入Visual C+ 2021的工作环境。3、编程例如,观察与验证。输入并运行下面的程序,分析运行结果。【任务实施】实验8-1-1 枚举类型元素引用例如源程序8-1-1:#include <stdio.h> void main( ) enum emem1=3,em2=1,em3; char *aa=“AA,BB,CC,DD; printf(“%s%s%sn,aaem1,aaem2,aaem3);C语言对枚举的定义规定:在枚举中声明的各个枚举元素,如果没有明确指出某个枚举元素的值,

2、它的上一个元素存在并有明确值的情况下,这个枚举元素的值为其上一个元素的值+1。在实验中,没有明确说明枚举元素em3的值,那么em3=em2+1=1+1=2,进而可知,在printf( )打印函数中,要打印的数组元素是aa3,aa1,aa2。所以运行结果如以下图所示: 图8-1-1 运行结果图1注意:1、printf(“%s,em1)不能输出字符串“em1。em1为常数值的别名,而不是字符串。 2、不能这样定义枚举类型:比方“enum em0,1,2;。那么假设要完整的打印出char *aa的赋值,我们就要修改源程序,大家注意观察我们修改后的源程序到底和之前的有何区别。 图8-1-1 修改后的源

3、程序2 修改后的源程序我们将得到对a的所有赋值,如以下图所示。 图8-1-1 修改后的运行结果图3【任务考核】 实验8-1-2 枚举类型元素引用例如 #include<stdio.h> int main() enum colorred,black,yellow,blue,whitei,j,pa; int n=0,loop; for(i=red;i<=white;i+)for(j=red;j<=white;j+)n+=1;printf("%-3d",n);for(loop=1;loop <3;loop+)switch(loop)case 1:pa

4、=i;break;case 2:pa=j;break;switch(pa)case red:printf("%-10s","red");break;case black:printf("%-10s","black");break;case yellow:printf("%-10s","yellow");break;case blue:printf("%-10s","blue");break;case white:printf("

5、;%-10s","white");break;printf("n");printf("N:%dn",n);return 0;1运行结果:2程序中有无错误为什么?3运行结果为什么与修改后的程序结果一致?【典型例题】例8-1-3 枚举类型例如源程序:#include <stdio.h>void main()typedef enum daysunday,monday,tuesday,wendsday,thursday,friday,stadurdayday;day today;today = monday;if (to

6、day = sunday | today = stadurday)printf(“休息日n);elseprintf(“工作日n);答案:工作日 图8-1-3分析:我们在此实验中发现一个有趣的表达式“day today;,根据我们所学的知识,我们知道enumdaysunday,monday,tuesday,wednesday,thursday,friday,saturday;这句定义了符号化的常量sunday,monday等等。在下面的程序中,可以声明枚举型变量day today,对其赋值,或者判断它的值。而且声明枚举变量时,编译器不必检查变量中存储的是否是合法的枚举有效值,但枚举变量那么提供了

7、检查的时机。我们在编程过程中定义枚举型的好处主要有二:首先增强程序可读性,sunday、monday肯定比0、1容易理解。其次可以对变量类型与取值进行限定。枚举型常量即某种枚举型的合法取值。此例中,“sunday,monday,tuesday,wednesday,thursday,friday,saturday是枚举型常量。在编译时确定各个常量的对应值。枚举型变量指的是声明为已定义枚举类型的变量。如此例中的today。用枚举型常量定义变量,这个说法不太明确,其实包含了三个阶段:一,定义一种枚举类型;二,声明某个变量为该枚举类型;三,用枚举型常量向该变量赋值。任务描述二 关于位运算应用实验【实验

8、目的】1、 加深对二进制的认识。2、 理解位运算的概念、各种位运算的功能和规那么,学会采用适当的位运算修改数据的某些位。3、 了解位段的概念和位段类型数据的引用形式。【根底知识】一、位运算位运算的运算分量只能是整型或字符型数据,位运算把运算对象看作是由二进位组成的位串信息,按位完成指定的运算,得到位串信息的结果。 位运算符有: &按位与、|按位或、按位异或、 按位取反。 其中,按位取反运算符是单目运算符,其余均为双目运算符。 位运算符的优先级从高到低,依次为、&、|。其中的结合方向自右至左,且优先级高于算术运算符,其余运算符的结合方向都是自左至右,且优先级低于关系运算符。 1按

9、位与运算符&按位与运算将两个运算分量的对应位按位遵照以下规那么进行计算: 0&0=0,0&1=0,1&0=0,1&1=1。 即同为 1 的位,结果为 1,否那么结果为 0。 例如,设3的内部表示为 00000011 5的内部表示为 00000101 那么3&5的结果为 00000001 按位与运算有两种典型用法,一是取一个位串信息的某几位,如以下代码截取x的最低7位:x& 0177。二是让某变量保存某几位,其余位置0,如以下代码让x只保存最低6位:x=x&077。以上用法都先要设计好一个常数,该常数只有需要的位是1,不需要的位是0

10、。用它与指定的位串信息按位与。 2按位或运算符| 按位或运算将两个运算分量的对应位按位遵照以下规那么进行计算: 0|0=0, 0|1=1, 1|0=1, 1|1=1 即只要有1个是1的位,结果为1,否那么为0。 例如,023|035 结果为037。 按位或运算的典型用法是将一个位串信息的某几位置成1。如将要获得最右4为1,其他位与变量j的其他位相同,可用逻辑或运算017|j。假设要把这结果赋给变量j,可写成: j=017|j 3按位异或运算符 按位异或运算将两个运算分量的对应位按位遵照以下规那么进行计算: 00=0, 01=1, 10=1, 11=0 即相应位的值相同的,结果为 0,不相同的结

11、果为 1。 例如: 013035结果为026。 异或运算的意思是求两个运算分量相应位值是否相异,相异的为1,相同的为0。按位异或运算的典型用法是求一个位串信息的某几位信息的反。如欲求整型变量j的最右4位信息的反,用逻辑异或运算017j,就能求得j最右4位的信息的反,即原来为1的位,结果是0,原来为0的位,结果是1。 4按位取反运算符 按位取反运算是单目运算,用来求一个位串信息按位的反,即哪些为0的位,结果是1,而哪些为1的位,结果是0。例如,7的结果为0xfff8。 取反运算常用来生成与系统实现无关的常数。如要将变量x最低6位置成0,其余位不变,可用代码x=x& 077实现。以上代码与

12、整数x用2个字节还是用4个字节实现无关。 当两个长度不同的数据进行位运算时(例如long型数据与int型数据),将两个运算分量的右端对齐进行位运算。如果短的数为正数,高位用0补满;如果短的数为负数,高位用1补满。如果短的为无符号整数,那么高位总是用0补满。 位运算用来对位串信息进行运算,得到位串信息结果。如以下代码能取下整型变量k的位串信息的最右边为1的信息位:(k-1)k)&k。 二、移位运算 移位运算用来将整型或字符型数据作为二进位信息串作整体移动。有两个运算符: << 左移 和 >> 右移 移位运算是双目运算,有两个运算分量,左分量为移位数据对象,右分量的

13、值为移位位数。移位运算将左运算分量视作由二进位组成的位串信息,对其作向左或向右移位,得到新的位串信息。 移位运算符的优先级低于算术运算符,高于关系运算符,它们的结合方向是自左至右。 1左移运算符<< 左移运算将一个位串信息向左移指定的位,右端空出的位用0补充。例如014<<2,结果为060,即48。 左移时,空出的右端用0补充,左端移出的位的信息就被丢弃。在二进制数运算中,在信息没有因移动而丧失的情况下,每左移1位相当于乘2。如4 << 2,结果为16。 2右移运算符>> 右移运算将一个位串信息向右移指定的位,右端移出的位的信息被丢弃。例如12&

14、gt;>2,结果为3。与左移相反,对于小整数,每右移1位,相当于除以2。在右移时,需要注意符号位问题。对无符号数据,右移时,左端空出的位用0补充。对于带符号的数据,如果移位前符号位为0(正数),那么左端也是用0 补充;如果移位前符号位为1(负数),那么左端用0或用1补充,取决于计算机系统。对于负数右移,称用0 补充的系统为“逻辑右移,用1补充的系统为“算术右移。以下代码能说明读者上机的系统所采用的右移方法: printf("%dnnn",-2>>4); 假设输出结果为-1,是采用算术右移;输出结果为一个大整数,那么为逻辑右移。 移位运算与位运算结合能实现许

15、多与位串运算有关的复杂计算。设变量的位自右至左顺序编号,自0位至15位,有关指定位的表达式是不超过15的正整数。以下各代码分别有它们右边注释所示的意义: 0 << n /* 实现最低n位为1,其余位为0的位串信息 */ (x>>(1+p-n)&(0<<n) /*截取变量x自p位开始的右边n位的信息*/ new |=(old>>row)&1)<<(15k) /*截取old变量第row位,并将该位信息装配到变量new的第15-k位*/ s&=(1<<j) /*将变量s的第j位置成0,其余位不变*/ fo

16、r(j=0;(1<<j)&s)=0; j+); /*设s不等于全0,代码寻找最右边为1的位的序号j*/!为逻辑取反,表示非的意思,经过它处理后的结果为布尔型,要么为0,要么为1,!x,只要x不为0,1,2,3,都可以,那么!x的结果就是0,只有当x为0时,结果为1。如果*为真,那么!*为假,反之如果*为假,那么!*为真。【实验内容、步骤】1、检查所用计算机是否已经安装Visual C+ 2021。2、进入Visual C+ 2021的工作环境。3、编程例如,观察与验证。输入并运行下面的程序,分析运行结果。【任务实施】实验8-2-1输入并运行以下程序关于位、与、或的实验,分析

17、程序运行结果。源程序8-2-1 # include <stdio.h> int main() int c,d,e; int a=6,b=12; c=a&b; d=ab; e=ab; printf(“%d&%d=%dn,a,b,c); printf(“%d%d=% dn,a,b,d); printf(“%d%d=%dn,a,b,e); return 0; 根据位、与、或的用法我们可以得出结果: 6&12=4 612=14 612=10接下来我们思考下,比方某驾校报名条件中有一条为年龄要求:学员年龄在1860之间,那么用逻辑与的关系表达那么应为:int a;.i

18、f ( 18 <= a && a <= 60) .用逻辑或的关系表达那么为:if ( 18 > a | a > 60) .然后再结合else if语句完成这一驾校的报名要求,并且分别输出满足的和不满足条件的年龄。源程序如以下图: 图8-2-1 源程序图1 我们运行源程序随意输入一些数字,得出如以下图的答案。 图8-2-1 运行结果图2实验8-2-2输入并运行以下关于移位程序,分析程序运行结果。源程序8-2-2# include <stdio.h>int main() int a=6,b=10; int c,d; C=a>>1; D

19、=b<<3; printf(“%d,%dn,c,d); return 0;运行程序,我们得到的运行结果为:3,80小提示:如果是左移,补入的数全部是0;如果是右移,还与被移位的数据是否带符号有关。假设是不带符号数,那么补入的数全部为0;假设是带符号数,那么补入的数全部等于原数的最左端位上的原数(即原符号位)。实验8-2-3输入并运行以下关于位操作程序,分析程序运行结果。源程序8-2-3 # include<stdio.h>struct packed_data unsigned a:3; unsigned b:4; unsigned:2; unsigned c:5; in

20、t i;data;int main() data.a=4; data.b=10; data.c=45; data.i=25; printf(“%d,%on ,data.c,data.c); return 0;运行源程序,我们可以得出运算结果为:13 ,15。我们仔细观察源程序发现:在程序中unsigned:2 ,和其他三个表达式是有区别的,这里大家注意:、位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的,程序在这里作对齐使用。位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。【任务考核】1. 编写程序,取出一个16位二进制数的奇数位即

21、从左边起第3,5,15位。2. 编写程序,从终端读入十六进制无符号整数m,将m中的原始数据循环右移n位,并输出移位前后的内容。 【典型例题】例8-2-1以下运算符中优先级最低的是( ),优先级最高的是( )。 A&& B& C D 答案:C B 分析:此题主要考查C语言运算符的优先级关系。例8-2-2表达式“0x13&0x17的值是( )。A0x17 B0x13 C0xf8 D0xec答案:B分析:将0x13和0x17转换成对应的二进制数后按位进行与运算,再把结果转换成十六进制数,计算的结果为0x13。例8-2-3假设x=2,y=3,那么x&y的结果是(

22、 )。A0 B2 C3 D5答案:B分析:x对应的二进制位为0010,y对应的二进制位为0011,两者按位与后的结果为0010,故对应的十进制数为2。例8-2-4表达式“0x130x17的值是( )。 A0x17 B0x13 C0xf8 D0xec答案:A 分析:将0x13和0x17转换成对应的二进制数后,按位进行或运算,再把结果转成十六进制数,计算的结果为0x17。例8-2-5假设有定义“int a=4,b;,那么执行“b=a<<2;后b的结果是( )。A4 B8 C16 D32答案:C分析:对于移位运算,左移一位相当于原数乘以2,右移一位相当于原数除以2。例8-2-6设有以下语

23、句,那么c的二进制数是( ),十进制数是( )。 char a=3,b=6,C; C=ab<<2; A00011011 B00010100C00011100D00011000 A. 27B20C28D24答案:A A分析:在一个表达式中出现和<<运算符时,应先计算<<再计算。例8-2-7以下表达不正确的选项是( )。A表达式“a&=b等价于“a=a&b B表达式“a=b等价于“a=abC表达式“a!=b等价于“a=a!B D表达式“a=b等价于“a= ab答案:C分析:“a!=b是一个关系表达式,不等价于“a=a!B。例8-2-8在位运算中运

24、算量每右移动一位,其结果相当于( )。A运算量乘以2 B运算量除以2C运算量除以4 D运算量乘以4答案:B分析:对于移位运算,左移一位相当于原数乘以2,右移一位相当于原数除以2。例8-2-9表达式“0x13的值是( )。A0xFFEC B0xFF71 C0xFF68 D0xFF17答案:A例8-2-10以下程序的运行结果是( )。# include <stdio. h>main() unsigned char a,b,c; a=0x3;b=a0x8;c=b<<1; printf(“%d,%dn,b,c); A-11,12 B-6,-13 C12,24 D11,22答案:

25、D分析:a对应的二进制数为011,与0x8进行按位或运算后,b的值为1011,对应十进制数为11,左移一位相当于原数乘以2,故c的值为22。【课后习题】一、选择题在以下各题的A、B、C、D四个选项中,只有一个正确,请选出正确答案1以下运算符优先级最高的是( )。A B C&& D*2运算符<<、sizeof、&=按优先级由高到低的正确排列次序是( )。Asizeof、&=、<<、Bsizeof、<<、&=C、<<、sizeof、&=D<<、&=、sizeof3请选择以下程序的执行

26、结果。( ),( ),( )。 # include <stdio. h>main() int a=0234; char c=A; printf(“%on,a); printf(“%on,a&c); printf(“%on,ac); A177543B177C175437 D17543 A0 B1 C163 D24 A35 B335 C53 D5334整型变量x和y的值相等,且均为非0值,那么以下选项结果为零的表达式是( )。Axy Bxy Cx&y Dxy5以下程序的运行结果是( )。# include <stdio.h>void main() char

27、x=040; printf(“%on,x<<1); A100 B80 C64 D326enum color red,green,yellow=5,white,black;定义了一枚举类型。值表中各标符的枚举值依次为 A1、2、3、4、5 B0、1、5、2、3 C0、1、5、6、7 D3、4、5、6、77设有如下枚举类型定义 enum language Basic=3, Assembly, Ada, C, Fortran;枚举量C的值为A4 B5 C6 D7二、填空题1位运算是对运算量的 位进行运算。2位运算符只对 和 数据类型有效。3在6个位运算符中,只有 是需要一个运算量的运算符

28、。4按位异或的运算规那么是 。5C语言中的位运算符有 、 、 、 、>>和<<共6个。6以下程序段的输出结果是 。 int x=-1; x=x0377; printf("%d,% xn,x,x);7设有一个整数a,假设要通过按位异或运算a-b使a的高8位翻转,低8位不变,那么b的八进制数形式是_。8设二进制数a是00101101,假设想通过按位异或运算a-b使a的高4位取反,低4位不变,那么二进制数b应是 。9设有一个整数a,假设要通过a&b运算屏蔽掉a中的其他位,而只保存第2位和第8位,那么b的八进制数形式是 。10如果想使一个数a的低4位全改为1,需要a与 进行按位或运算。三、编程题1设计一个函数,当给出一个数的原码时,能得到该数的补码。2编写一个函数,用它测定一个整数的最高位是0还是1,假设是0,那么输出“正数,否那么输出“负数。3编写一个函数getbits(),从一个16位单元中取出某几位,即该几位保存原值,其余位为0,位数由输入者设定。 【任务考核答案】一、枚举局部 实验8-3 1运行结果: 2程序中有无错误为什

温馨提示

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

评论

0/150

提交评论