C语言程序设计提高篇第4章位运算课件.ppt

上传人(卖家):晟晟文业 文档编号:4145116 上传时间:2022-11-14 格式:PPT 页数:39 大小:212.38KB
下载 相关 举报
C语言程序设计提高篇第4章位运算课件.ppt_第1页
第1页 / 共39页
C语言程序设计提高篇第4章位运算课件.ppt_第2页
第2页 / 共39页
C语言程序设计提高篇第4章位运算课件.ppt_第3页
第3页 / 共39页
C语言程序设计提高篇第4章位运算课件.ppt_第4页
第4页 / 共39页
C语言程序设计提高篇第4章位运算课件.ppt_第5页
第5页 / 共39页
点击查看更多>>
资源描述

1、提高篇C语言程序设计提高篇第第4 4章章 位运算位运算 提高篇位运算操作位运算操作位段的概念位段的概念提高篇字节和位的有关概念;字节和位的有关概念;正确使用常见的位运算符和位运算操作;正确使用常见的位运算符和位运算操作;牢记位段的要领及位段的使用方法。牢记位段的要领及位段的使用方法。提高篇C语言既是一种高级语言,广泛应用于应用软语言既是一种高级语言,广泛应用于应用软件的开发和程序设计,同时又是一种低级语言,件的开发和程序设计,同时又是一种低级语言,可以用于系统软件的开发和程序设计,如自动可以用于系统软件的开发和程序设计,如自动控制系统中的过程控制、参数检测、数据通讯控制系统中的过程控制、参数检

2、测、数据通讯等控制程序,都可以综合利用等控制程序,都可以综合利用C语言中的指针语言中的指针操作、位运算和位段技术来实现。操作、位运算和位段技术来实现。本章介绍位运算的基本形式和常用运算符本章介绍位运算的基本形式和常用运算符,并并简要介绍位段的概念。位运算的深入学习,应简要介绍位段的概念。位运算的深入学习,应该在该在计算机原理计算机原理和和汇编语言程序设计汇编语言程序设计课程中进行。课程中进行。提高篇位运算概述位运算概述所谓所谓“位运算位运算”,是指按二进制位进行运算。,是指按二进制位进行运算。位运算的特点:位运算的特点:运算按二进制逐位进行运算按二进制逐位进行没有借没有借位和进位。位和进位。位

3、运算量位运算量:整型(:整型(int,short,unsiged,long)/字符型(以补码字符型(以补码/ASCII码形式存储),不可为码形式存储),不可为实型。实型。提高篇位运算符位运算符(Bitwise Operators)运算符运算符名称名称举例举例优先级优先级按位取反按位取反flag(高高)(算术运算符算术运算符)左移左移a 右移右移b 3(关系运算符关系运算符)&按位与按位与flag&0 x37按位异或按位异或flag 0 xC4|按位或按位或flag|0 x5A(低低)(赋值运算符赋值运算符)提高篇 位运算符还可与赋值运算符相结合,进行位运算位运算符还可与赋值运算符相结合,进行位

4、运算赋值操作。如:赋值操作。如:a&=b 等价于等价于 a=a&b a=b 等价于等价于 a=ab 位运算时的数据类型为位运算时的数据类型为char/int,分析时要化分析时要化为二进制形式,但在程序中书写及输出结果时仍为二进制形式,但在程序中书写及输出结果时仍为为char/int。负数以补码形式参与运算负数以补码形式参与运算 注意与逻辑运算区别注意与逻辑运算区别提高篇按位与(Bitwise AND)运算规则运算规则 0&0=0;0&1=0;1&0=0;1&1=1;用法用法 按位清零按位清零 保留某些指定位保留某些指定位位运算符的使用提高篇例例1 1#include void main()in

5、t a,b;printf(Enter a and b:);scanf(%d,%d,&a,&b);printf(a&b=%dn,a&b);计算 010 000(a)&011 111(b)010 000 001 010 (a)&010 000 (b)000 000 Enter a and b:16,31a&b=16Enter a and b:10,16a&b=0提高篇按位或(Bitwise Inclusive OR)运算规则运算规则 0|0=0;0|1=1;1|0=1;1|1=1;用法用法 按位定值为按位定值为1提高篇例例2#include void main()unsigned char a,b

6、;printf(Enter a and b:);scanf(%o,%o,&a,&b);printf(a|b=%on,a|b);Enter a and b:20,30a|b=30Enter a and b:12,20a|b=32计算计算 010 000 (a)|011 000 (b)011 000 001 010 (a)|010 000 (b)011 010 提高篇按位异或按位异或(Bitwise Exclusive OR,XOR)运算规则运算规则 0 0=0;0 1=1;1 0=1;1 1=0;说明说明 相相“异异”则为则为1,相,相“同同”则为则为0提高篇例例3以下程序的功能是将以下程序的功

7、能是将a数据的低数据的低4位取反。位取反。#include void main()unsigned char a=0 x39,b=;a=ab;printf(%xn,a);答案:答案:0 x0f 计算计算 00111001(a)00001111(b)00110110 l与与0相异或,保持原值不变相异或,保持原值不变l与自身相异或,则全部位清零与自身相异或,则全部位清零l交换两个整数值交换两个整数值na=ab;b=ba;a=ab;提高篇交换两个整数值不用临时变量交换两个整数值不用临时变量#include void main()int a=3,b=4 ;a=ab;b=ba;a=ab;printf(“

8、a=%d b=%dn,a,b);结果:结果:a=4 b=3提高篇按位取反按位取反(Ones Complement)运算规则运算规则 0=1;1=0;用法用法 所有位翻转所有位翻转 获得适用于不同系统的位运算模板获得适用于不同系统的位运算模板提高篇例例4#include void main()int a=32767;int b=a;printf(a=%d,b=%dn,a,b);结果:结果:a=32767a=32767,b=-32768b=-32768 计算计算a:原码原码:0111111111111111b:补码补码:1000000000000000提高篇左移(Left Shift)运算规则运算

9、规则 i n 把把i各位全部向左移动各位全部向左移动n位位 最左端的最左端的n位被移出丢弃位被移出丢弃 最右端的最右端的n位用位用0补齐补齐 用法用法 若没有溢出,则左移若没有溢出,则左移n位相当于乘上位相当于乘上2n 运算速度比真正的乘法和幂运算快得多运算速度比真正的乘法和幂运算快得多提高篇例例5 5以下程序的运行结果是以下程序的运行结果是 60 60 。#include void main()unsigned int a=15,b;b=a2;printf(%d,%dn,a,b);提高篇例例6 6以下程序的运行结果是以下程序的运行结果是 。#include void main()int a=

10、12,b;b=0 x1f5&a3;printf(%d,%dn,a,b);结果:12,96计算已知:0 x1f5为1 1111 0101且:a为1100 a n 把把i各位全部向右移动各位全部向右移动n位位 最右端的最右端的n位被移出丢弃位被移出丢弃 最左端的最左端的n位用位用0补齐补齐(逻辑右移逻辑右移)或最左端的或最左端的n位用位用符号位符号位补齐补齐(算术右移算术右移)用法用法 右移右移n位相当于除以位相当于除以2n,并舍去小数部分并舍去小数部分 运算速度比真正的除法和幂运算快得多运算速度比真正的除法和幂运算快得多提高篇例例7以下程序的运行结果是以下程序的运行结果是 4,5 。#inclu

11、de void main()int a=16,b=20;printf(%d,%d,a2,b2);提高篇应用示例 从整数a最右端第m个位置开始取该位开始右面n位。算法如下:b=a(m-n+1)c=(0n)d=b&c 注:位自右向左从0开始编号提高篇应用示例 将一个整数a循环右移n位。算法如下:b=anc=c|b 提高篇 例例8:将将16进制短整数按二进制打印输出进制短整数按二进制打印输出输入:输入:F1E2输出:输出:1111000111100010输入:输入:13A5输出:输出:0001001110100101提高篇算法思想:算法思想:从高位到低位逐位测试每一位是从高位到低位逐位测试每一位是0

12、或是或是1。可顺。可顺次设置屏蔽字分别为次设置屏蔽字分别为1000 0000 0000 0000、0100 0000 0000 0000、0000 0000 0000 0001,与,与该数进行该数进行&运算,从而保留所需的一个位的状态运算,从而保留所需的一个位的状态(其余各位为其余各位为0)。若结果非零则输出。若结果非零则输出1,否则输出,否则输出0。提高篇#include void main()int i;short a;scanf(%X,&a);for(i=15;i=0;i-)printf(%1d,a&1i?1:0);提高篇 C语言允许在一个结构体中以位为单位来语言允许在一个结构体中以位为

13、单位来指定其成员所占内存长度。这种以位为指定其成员所占内存长度。这种以位为单位的成员称为单位的成员称为“位段位段”。提高篇位段的概念位段的概念1.1.位段的含义位段的含义 位段是以位为单位定义长度的结构体类型中的成员位段是以位为单位定义长度的结构体类型中的成员.2 2、位段的构成、位段的构成例如例如:struct pack unsigned a:2;unsigned b:6;unsigned c:8;int x;data;这个结构体类型的变量在内存中的情况为这个结构体类型的变量在内存中的情况为:a b c x2 26 68 81616提高篇也可以使各个字段不恰好占满一个字节也可以使各个字段不恰

14、好占满一个字节struct pack unsigned a:2;unsigned b:6;unsigned c:4;int x;data;则内存中的分配形式为则内存中的分配形式为:此处:此处:a,b,ca,b,c共占共占2 2个字节中的个字节中的1212位,空闲位,空闲4 4位位,intint型的型的x x从一个新的字节开始从一个新的字节开始.a b c x2 26 64 41616 空闲4 4提高篇对位段中数据的引用方法对位段中数据的引用方法1 1、方法:通过结构体成员来应用:、方法:通过结构体成员来应用:如:如:data.a=2;data.b=6;2 2、要点:要点:注意每个字段的最大取值

15、范围注意每个字段的最大取值范围.如如:data.a:data.a的取值只能是的取值只能是:03,:03,因为两位二进制最大表示的数为因为两位二进制最大表示的数为3.3.提高篇 1.1.若某个位段要从新的存储单元开始若某个位段要从新的存储单元开始,可以这样定义可以这样定义:struct packunsigned a:2;unsigned :0;unsigned b:4;unsigned c:4;int x;data;注意:长度为注意:长度为0 0的位段的作用是使下一个位段的的位段的作用是使下一个位段的内容从新的存储单元开始存放。内容从新的存储单元开始存放。位段的使用要点位段的使用要点提高篇位段的

16、使用要点位段的使用要点 2.一个位段存储在同一个机器字中一个位段存储在同一个机器字中,不能跨不能跨字存储字存储.如下面的定义是错误的如下面的定义是错误的(假设机器假设机器的字长为的字长为16位位)struct pack unsigned a:2;unsigned b:5;unsigned c:10;unsigned d:4;int x;data;提高篇3.可以定义无名字段可以定义无名字段struct pack unsigned a:2;unsigned :5;/*空闲不用空闲不用*/unsigned b:2;unsigned c:4;int x;data;位段的使用要点位段的使用要点提高篇 4

17、.位段可以用十进制的整型形式输出位段可以用十进制的整型形式输出,也可以用其也可以用其他的整型格式输出他的整型格式输出(如八进制如八进制,十六进制和无符号十六进制和无符号),位段以整型的形式参加算术运算位段以整型的形式参加算术运算.分析下面的程序:分析下面的程序:例例9:void main()struct pack unsigned a:2;unsigned b:3;unsigned c:1;unsigned d:4;unsigned e:3;unionstruct pack qp;unsigned i;abc;abc.i=255;printf(“%dn”,abc.qp.d);位段的使用要点位段

18、的使用要点提高篇例例10:分析下列程序的输出结果:分析下列程序的输出结果#define N 2#define CUBE(X)(X*X*X)#include void main()int i=N+2;i=CUBE(i);printf(%dn,i);运行结果为:运行结果为:64提高篇 例例11:下列程序的输出结果是什么:下列程序的输出结果是什么?#include void main()struct equip unsigned a:2;unsigned b:3;unsigned c:1;unsigned d:4;unsigned e:3;unsigned :3;union struct equip

19、 eq;unsigned i;abc;abc.i255;printf(“%dn,abc.eq.d);运行结果为:运行结果为:3提高篇习题习题4.1 编写一个函数编写一个函数getbits,从一个从一个16位的单元中取出位的单元中取出某几位某几位(即该几位保留原值,其余位为即该几位保留原值,其余位为0)。函数调用。函数调用形式为形式为getbits(value,n1,n2)。value为该为该16位位(两个字节两个字节)中的数据值,中的数据值,n1为欲为欲取出的起始位,取出的起始位,n2为欲取出的结束位。如为欲取出的结束位。如:getbits(0101675,5,8)表示对八进制表示对八进制10

20、1675这个数,这个数,取出它的从左面起第取出它的从左面起第5位到第位到第8位。位。提高篇4.2 写一函数,对一个写一函数,对一个16位的二进制数取出它的奇位的二进制数取出它的奇数位数位(即从左边起第即从左边起第1、3、5、15位位)。4.3 编一程序,检查一下你所用的计算机系统的编一程序,检查一下你所用的计算机系统的C编编译在执行右移时是按照逻辑位移的原则还是按算术译在执行右移时是按照逻辑位移的原则还是按算术右移原则?如果是逻辑右移,请你编一函数实现算右移原则?如果是逻辑右移,请你编一函数实现算术右移?如果是算术右移,请编写一函数以实现逻术右移?如果是算术右移,请编写一函数以实现逻辑右移。辑右移。提高篇4.4 编一函数用来实现左右循环移位。函数名编一函数用来实现左右循环移位。函数名为为move,调用方法为调用方法为move(value,n)其中其中value为要循环位移的数,为要循环位移的数,n为位移的位数。为位移的位数。如如n0表示为左移;表示为左移;n0为右移。如为右移。如n=4,表表示要右移示要右移4位;位;n=-3,为要左移为要左移3位。位。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(C语言程序设计提高篇第4章位运算课件.ppt)为本站会员(晟晟文业)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|