C语言程序设计模块九位作训练_第1页
C语言程序设计模块九位作训练_第2页
C语言程序设计模块九位作训练_第3页
C语言程序设计模块九位作训练_第4页
C语言程序设计模块九位作训练_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

1、模块九模块九 位操作训练位操作训练能力目标理解位运算的含义及使用;了解位段的定义、存储及使用。知识准备知识准备任务引例-不用第三个变量完成两个变量值的交换。方案一:传统算法是通过第三个变量完成交换。#void swap1(int *a,int *b) int temp; temp=*a; *a=*b; *b=temp;程程序序清清单单方案二:加减运算,把第一个变量当缓冲变量用。void swap2(int *a,int *b) *a=*a+*b; *b=*a-*b;/b中放原来a中的值 *a=*a-*b;/ 用这1条语句a = a + b - (b = a); 代替3条语句程序清单程序清单方案

2、三:乘除运算,是把第一个变量当缓冲变量用。void swap3(int *a,int *b) *a=(*a)*(*b); *b=(*a)/(*b);/b中放原来a中的值 *a=(*a)/(*b); / 用这1条语句a = a + b - (b = a); 代替3条语句程序清单程序清单方案四:异或运算。#include stdio.hvoid swap4(int *a,int *b) *a=*a*b; *b=*a*b; *a=*a*b;int main() int a=123,b=321; swap1(&a,&b);printf(a=%d,b=%dn,a,b); swap2(&a

3、mp;a,&b); printf(a=%d,b=%dn,a,b); swap3(&a,&b); printf(a=%d,b=%dn,a,b);swap4(&a,&b);printf(a=%d,b=%dn,a,b); return 0;程序清单程序清单输出结果输出结果 a=321,b=123a=321,b=123a=123,b=321a=123,b=321a=321,b=123a=321,b=123a=123,b=321a=123,b=321说明位运算符中除了“” 以外,均为二元运算符。运算量应为整型或字符型的数据。9.1 位运算符 位bit):二进制位是

4、计算机中最小的信息单位:n位二进制能表达2n个信息。 9.1.1 按位与运算(&)第7位第6位第5位第4位第3位第2位第1位第0位MSB LSB10010101做中学做中学9-1 9-1 设有设有X=10X=10,Y=8Y=8,Z=X&YZ=X&Y按位与),求按位与),求Z Z的值。的值。#includevoid main() int X=10,Y=8; int Z; Z=X&Y; printf(“Z=%dn”;Z);程序清单程序清单输出结果输出结果 Z=8 Z=8知识点运算规则 只有对应的位都为1时,按位与运算的结果才为1,其他的情况均为0,即: 0&

5、0=0 0&1=0 1&0=0 1&1=1 示例分析:X=(1010=(000010102,Y=(810=(000010002 X00001010&Y00001000 Z00001000按位与运算的用途可以对某位进行清0操作 方法:将需要清0的对应位与0进行按位与操作即可。 如:若将00010011的低四位清0,只需将其低4位与0相与,高4位与1相与即可,也就是进行以下操作: 00010011&11110000 00010000可以提取指定位 方法:将需要提取的位与1进行按位与操作即可 如:假设有X=l0101110B,想取X的低4位。将X与Y=0000

6、1111B相与,即可得到X的低4位。则有: 10101110&00001111 00001110#includevoid main() int X=12,Y=9; int Z; Z=X|Y; printf(“Z=%dn”;Z);程序清单程序清单输出结果输出结果 Z=13 Z=139.1.2 按位或运算(|)做中学做中学9-2 9-2 假设有假设有X=12X=12,Y=9Y=9,Z= X | YZ= X | Y按位或),则求按位或),则求Z Z 的值。的值。知识点运算规则 只有对应的位都为0时,按位或运算的结果才为0,其他的情况均为1,即:0|0=0 0|1=1 1|0=1 1|1=1

7、示例分析:X=(1210=(000011002,Y=(910=(000010012 X00001100|Y00001001 Z00001101位或运算的用途 主要是对数据的某些位进行置1操作。 方法:将需要置1的位与1进行按位或操作即可。 如:假设有X=11010010B,想使X的低4位为l。可将X与Y=0000llllB按位相或。则有: 11010010|00001111 11011111#includevoid main() int X=10,Y=8; int Z; Z=XY; printf(“Z=%dn”;Z);程序清单程序清单输出结果输出结果 Z=2 Z=29.1.3 按位异或运算()

8、做中学做中学9-3 9-3 设有设有X=10X=10,Y=8Y=8,Z=XYZ=XY按位异或),求按位异或),求Z Z的值。的值。知识点运算规则 参与按位异或运算的两个二进制位如果值相同,则结果为0,如果不同则结果为1.即: 00=0 01=1 10=1 11=0示例分析:X=(1010=(000010102,Y=(810=(000010002根据“异或的运算规则,有: X00001010Y00001000 Z00000010按位异或运算的用途与0异或,可以保留原值 方法:原数中的1与0进行异或运算得1,0与0异或运算的0。 例如:将29与0按位异或可以保留29。具体如下: 000111010

9、0000000 00011101v 将特定位翻转v 方法:要翻转的位与1异或运算,其余位与0异或运算。v 例如:假设有X=10101110B,则想使X的低4位翻转。v 根据“按位异或“的运算规则,可将X与Y00001111B按位相异或,则有: 1010111000001111 10100001v 实现两个变量值的交换v 9.1任务引例的方案四就是利用异或运算完成了两个变量值的交换。v 例如:a=5,b=4,利用异或运算完成a=4,b=5。具体如下:v a=ab=101100=001v b=ab=001100=101v a=ab=101001=100v 完成了a,b的交换。#includevoi

10、d main() int X=10; int Z; Z=X; printf(“Z=%dn”;Z);程序清单程序清单输出结果输出结果 Z=11 Z=119.1.4 按位取反运算()做中学做中学9-4 9-4 设有设有X=10X=10,Z=XZ=X按位取反),求按位取反),求Z Z的值。的值。知识点运算规则 对一个二进制数按位取反,即将0变为l,1变为0。 示例分析:X=(1010=(000010102,根据“取反的运算规则,有:即Z=X=(11110101)2=(-11)10X00001010 Z11110101本卷须知单目运算符,具有右结合性;运算符的优先级别最高。 9.1.5 左移运算()语

11、法格式:an运算规则:在移位过程中,各个二进制位顺序向左移动,右端空出的位补0,移出左端之外的位则被舍弃。例如:假没有X=10,其二进制的存储形式为00001010,将X左移2位,即X=X2,求X的值。 9.1.6 右移运算(n运算规则:对于无符号数最高位即左端空出的位一律补0;对于有符号数:正数则最高位补0,如果为负数,左端最高位补0还是补1则取决于所用的C编译系统。例如:有数X=10010001B X1:01001000B(逻辑右移) X1:11001000B(算术右移)#include void main() int x,y; printf(请输入一个16进制表示的正整数:); scan

12、f(%x,&x); y=0; y=y; y4; x&=y; printf(该数的4-7位用十六进制表示是:%xn,x);程程序序清清单单9.1.7 复合赋值位运算做中学做中学9-5 9-5 将变量将变量x x的的 4-7 4-7位看成一个整数值,求这个值的大小。位看成一个整数值,求这个值的大小。程序运行程序运行 请输入一个请输入一个1616进制表示的正整数:进制表示的正整数:acdeacde该数的该数的4-74-7位用十六进制表示是:位用十六进制表示是:d d边学边练边学边练将十进制数转换为二进制形式。编写一个位运算演示器,该程序能演示计算机中每位二进制位运算的运算过程。拓展提

13、升拓展提升9.2 位段9.2.1 位段的定义位段的语法格式: struct 位段名位段成员列表;位段列表的格式: 类型说明符 位段成员名:位段长度; 如:struct wd int a:9; int b:3; int c:0; /*空域*/ unsigned d:5; /*从下一内存单元开始存放*/ int i;/在Turbo C中i为16位 unsigned :8; /无名位段成员说明位段的成员类型必须为unsigned或int型;位数为1的位段只能用unsigned。每个位段成员的长度不能超过字长Turbo C中字长为16位,即一个存储单元为16位),所有位段成员的总长度可以超过字长。长度

14、为0的位段叫空域,其作用是使下一个位段在下一个存储单元中开始存放。各个位段必须依次单独定义,不能把几个位段组织成数组。位段可以含无名成员,这时它只用来作填充或调整位置,无名的位段成员是不能使用的。位段结构中可以包含整型变量或数组成员,但变量或数组名后不能跟冒号和位数,系统自动将他们从新的存储单元开始存放。位段结构变量可以按位段初始化,初值表中,不需要初始化的位段用逗号跳过。9.2.2 位段的引用位段的引用和结构成员的引用相同。一般形式为: 位段变量名. 位段成员名位段成员名使用与一般变量的使用一样,可以进行相应的运算。做中学做中学9-6 9-6 位段成员的输出。位段成员的输出。#include void main() struct unsigned a:1; unsigned b:3; int

温馨提示

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

评论

0/150

提交评论