C程序设计教案(第9章第1次)
- 格式:doc
- 大小:61.00 KB
- 文档页数:5
周次:第 周 课次:第一课 授课时间:年 月 日
一、 章节内容:
第9章 位运算
二、 教学目标:
通过本章的学习,要求能理解二进制位运算操作和位段结构,能熟练使用位运算符进行程序设计的方法,学习位操作能够为硬件平台的程序设计奠定基础。为后续课程的学习起到铺垫作用。
三、 教学重点:
1) 掌握位逻辑运算;
2) 掌握移位运算;
3) 掌握复合赋值位运算。
四、 教学难点:
1) 掌握不等长数据的位运算。
2) 理解位段的结构、存储及使用
五、 教学方法和授课手段
多媒体教室,电子课件。
六、 教学过程:
一) 预备(复习):结构体、共用体、枚举类型。(5分钟)
二) 课前提问(5 分钟)
三) 课程引入:介绍二进制运算的基本知识,原码,反码,补码。(10分钟)
四) 课程新授:(60分钟)
9.1 位运算的C程序实例
位运算引例
【例9.1】一个简单的位运算C程序
/*
源文件名:Li9_1.c
功能:从键盘输入两个整数a和b,分别对其进行位运算。
*/
#include
void main()
{
int a,b;
int e,f,g,h,i; 2 2 puts("请输入整数a和b:"); /*打印输出一串字符串*/
scanf("%d%d",&a,&b); /*假如这里输入的值为a=2,b=3*/
/*那么转化为二进制位有a=(00000010)2,b=(00000011)2 ,进行如下运算*/
e=a|b; /*a与b进行或运算,结果存入到变量e中*/
f=a&b; /*a与b进行与运算,结果存入到变量f中*/
g=a^b; /*a与b进行异或运算,结果存入到变量g中*/
h=~a; /*对a进行取反运算,结果存入到变量h中*/
i=b<<2; /*对b进行左移2位运算,结果存入到变量i中*/
printf("e=%d\n",e);
printf("f=%d\n",f);
printf("g=%d\n",g);
printf("h=%d\n",h);
printf("i=%d\n",i);
}
9.2 二进制位运算
9.2.1 位逻辑运算
位逻辑运算用来对某一个或某一对二进制位进行操作,其运算符有以下几个:
~表示按位取反
&表示按位与
∣表示按位或
^ 表示按位异或
除了~是一元运算符外,&、∣、^都是二元运算符。位逻辑运算的运算对象是整数。
位逻辑运算规则与逻辑运算(&&、∣∣、!)一样,也可用真值表表示。设a、b分别表示一个二进制位,则按位逻辑运算的真值表可表示成如表9-1所示的形式。
1.按位与运算
按位与逻辑运算的运算规则是:只有对应的位均为1时,与运算的结果才为1,其他的情况均为0。即:
0&0=0 0&1=1 1&0=0 1&1=1
2.按位或运算
按位或运算的运算规则是:只有按位或操作的对应位均为零时,结果才为零,其他情况按位或的结果均为1。即,
0|0=0 0|1=1 1|0=1 1|1=1
3.按位异或运算
按位异或的运算规则是:参与按位异或运算的两个二进制位如果相同,则结果为0,如果不同则结果为1。即,
0^0=0 0^1=1 1^0=1 1^1=0
4.按位取反运算
按位取反运算的运算规则是:0的按位取反结果为1,1的按位取反结果为0。即, 3 3 ~0=1 ~1=0
9.2.2移位运算
移位运算实现二进制位的顺序向左或向右移位。
1.左移位运算
左移位运算符是<<,其语法格式为:
a< 其中,a是操作数,可以是一个char型或整型的变量或表达式;n是待移位的位数,必须是正整数。功能是将a中所有的二进制位数向左移动n位。 左移位的运算规则是:在移位过程中,各个二进位顺序向左移动,右端空出的位补0,移出左端之外的位则被舍弃。例如,a=10,其二进制的存储形式为00001010,则a<<2表示将a的各个二进制位顺序左移2位:00101000,即十进制的40。 2.右移位运算由左移位的规则可以看出,对于无符号数而言,左移位相当于乘2运算,左移n位相当于乘2的n次方。 右移位运算符是>>,其语法格式为: a>>n 其中,a是操作数,可以是一个char型或整型的变量或表达式;n是待移位的位数,必须是正整数。功能是将a中所有的二进制位数向右移动n位。 右移位的运算规则是:在移位过程中,各个二进位顺序向右移动,左端空出的位补0还是补1取决于被移位的数是有符号数还是无符号数,具体为: ⑴对于无符号数进行右移时,左端空出的为一律补0。 ⑵对于用补码表示的有符号数进行右移时,如果采用逻辑右移,则不管是正数还是负数,左端空位一律补0;如果采用算术右移,则正数右移,左端的空位全部补0;负数右移,左端的空位全部补1(即符号位)。Turbo C采用的是算术右移。 9.2.3复合赋值位运算符 位运算符可以和赋值运算符构成复合赋值位运算符。 复合赋值位运算符的形式有:&=、|=、^=、~=、<<=、>>=。 9.2.4不同长度的数据进行位运算 当参加位运算的两个操作数的数据长度不等时,例如:一个int型的数据,另一个long型的数据,则两个数参加运算时,系统自动按右对齐。对于无符号数,系统在做对齐处理时,左端一律补0。对于有符号数来说,整数在做对齐处理时,左端补0;负数在做对齐处理时,左端补1。 9.3 位段 位段是由一个或几个二进制位组成的独立数据项。如果一个结构只含有整型的成员及位段成员,这种结构被称为位段结构。因此,位段结构只是结构的一个特例,有关结构的定义、引用、赋值、在函数间的传递等,都可以引申到位段结构中来;位段结构的特殊性就是其各个成员只能是整型的。因此,本节仅就位段成员方面的问题作一些说明。 9.3.1位段结构类型及位段结构变量的定义 位段结构类型及位段结构变量的定义格式为: struct 结构标识符 4 4 { 数据类型 位段名1:位数; 数据类型 位段名2:位数; …… 数据类型 位段名n:位数; }[位段结构变量表]; 其中,各位段的数据类型必须是int、signed或unsigned;位数为1的位段只能用unsigned;每个位段名后紧跟一个冒号,冒号后面是该位段的位数。 对位段结构的定义应注意以下几点: ⑴各个位段必须依次单独定义,不能把几个位段组织成数组。 ⑵每个位段的长度可以超过一个字节,但不能超过计算机的字长(在Turbo C2.0中为16位),所有位段的总长度则可以超过一个计算机字长,超过的部分会占用下一个存储单元。由于不允许一个位段跨越两个字长的存储单元,可定义一个长度为0的位段,以保证下一个位段从新的存储单元开始。 ⑶如果位段结构的总长度不足n个计算机字长,余下的位可以定义一个不使用的位段或无名位段。 ⑷位段结构变量可以按位段初始化,初值表中,不需要初始化的位段用逗号跳过。 ⑸位段结构中也可以包含整型的变量或数组成员,但变量或数组名后不能跟冒号和位数,系统自动将他们从新的存储单元开始存放。 ⑹结构中可以包含位段成员。 9.3.2位段结构的存储 位段结构中的所有成员按先后次序存放,但存储单元中位段的空间分配方向则随机而异。由于不同计算机的字长不同,造成使用位段结构的程序很难移植。下面以从左到右的空间分配方式,通过实例将位段结构存储分配中的几个问题说明如下: ⑴每个位段结构变量有自己的起始地址,其中的每一个整型变量或数组成员也有各自的地址,但位段成员则没有自己的地址,不能对位段成员进行取地址运算。 ⑵对于前面定义的位段结构变量ch来说,由于变量i必须从新的字节开始存放,因此系统自动在位段a3后面闲置5位。因此变量ch的存储格式为: a1 a2 a3 空闲 i 2 5 4 5 16(二进制位数) 五) 课程小结(10分钟) 位操作是对字节或字节内的二进制位进行测试、设置、或逻辑的运算。位操作可以分为两类:一类是逻辑位运算,另一类是移位运算。 位逻辑运算用来对某一个或某一对二进制位进行操作,其运算符有以下几个: ~表示按位取反 &表示按位与 ∣表示按位或 ^ 表示按位异或 移位运算实现二进制位的顺序向左或向右移位。 位运算符可以和赋值运算符构成复合赋值位运算符。 复合赋值位运算符的形式有:&=、|=、^=、~=、<<=、>>=。 位段是由一个或几个二进制位组成的独立数据项。 位段结构中的所有成员按先后次序存放,但存储单元中位段的空间分配方向则随机而5 5 异. 七、 作业安排: 1) 预习第十章的内容 2)预习实验十二的内容 3) 第一章习题 1、2、3、1)2)